无法理解Connect模块中的callback
我在读一本关于NodeJs Connect的书。 有关于basicAuth
模块的这个小部分。 我知道basicAuth
已经被弃用了,但是我不能理解这个简单的代码。 这本书说
提供asynchronouscallback函数
最后一个选项是类似的,除了这次callback传递给了带有三个参数的basicAuth(),这个参数可以使用asynchronous查找。 从磁盘上的文件进行身份validation或从数据库查询时,这非常有用。
代码清单7.7 连接basicAuth中间件组件进行asynchronous查找
而没有其他的信息。 这就是关于在basicAuth
中进行callback的整个部分
所以,代码获取用户名和密码。 然后假设的对象User
有一个方法来authendicate
这个用户是否真的存在。 完成后,调用gotUser
函数。 gotUser
包含返回的错误(=找不到用户名/密码的用户)或返回的用户对象(用该用户名/密码find的用户)。 我对吗?
gotUser
检查是否有错误。 如果有,则返回并调用具有错误参数的callback
。 那么等一下,这个callback
做什么呢? 它没有在任何地方定义 它将错误传递给error handling函数吗? 如何?
如果没有错误, gotUser
再次用null
(=没有错误)和user
gotUser
调用callback
。 再一次,callback会做什么? 为什么将返回的用户传递给callback,而不是获取其名称,邮件,年龄等,并在会话中使用它们,或填充标记的innerHTML
或其他?
谢谢
所以,等等,这个时候
callback
做什么? 它没有在任何地方定义
callback
的值由basicAuth
中间件定义。
您可以在模块的index.js
中的connect basic-auth-connect
in使用的basic-auth-connect
模块中find它的定义:
callback(user, pass, function(err, user){ if (err || !user) return unauthorized(res, realm); req.user = req.remoteUser = user; next(); });
当gotUser()
调用callback(...)
,它会从上面的代码片段调用function(err, user){...}
,传递err
和/或user
一起使用。
而且,他们是如何使用的,在你想知道的两个场景中…
gotUser
检查是否有错误。 如果有,则返回并调用具有错误参数的callback
。 所以,等等,这个时候callback
做什么?
如果没有错误,
gotUser
再次用null
(=没有错误)和user
gotUser
调用callback
。 再一次,callback会做什么?
if (err || !user)
条件将通过(一个有错误,另一个缺less用户)。 然后它认为请求是unauthorized
并立即结束响应。
function unauthorized(res, realm) { res.statusCode = 401; res.setHeader('WWW-Authenticate', 'Basic realm="' + realm + '"'); res.end('Unauthorized'); };
为什么将返回的用户传递给callback,而不是获取其名称,邮件,年龄等,并在会话中使用它们,或填充标记的
innerHTML
或其他?
中间件正在将关注点分离,尽可能保持简洁和简洁。 目标只是确定一个req.user
并validation它。
成功完成后,应用程序队列中的其他中间件将能够引用已find的user
。 这可以包括使用它来从视图呈现标记:
// determine the user app.use(connect.basicAuth(...)); // now make use of it app.use(function (req, res, next) { viewEngine.render('view', { user: req.user }, function (err, result) { if (err) return next(err); res.setHeader('Content-Type', 'text/html'); res.end(result); }); });
注:这是一般化的,不会按原样运行。 您需要find并设置您select的视图引擎,并将其replace为片段。
另外,关于…的附注
填充标签的
innerHTML
尽pipeNode.js正在执行JavaScript,但它在自己的环境中执行,完全脱离任何浏览器。 直接与用户目前看到的DOM交互是不可能的。
有几个不同的事情正在进行。 首先,app.use期待一个将被req,res和next调用的函数。 当你运行connect.basicAuth时,它运行这个方法。
由于这是一种中间件方法,因此每次在此方法之后定义的路由都将被运行。
第二件事是connect.basicAuth是一个函数,将被调用用户名,密码和callback方法。 callback是connect.basicAuth提供的。
如果你返回回叫(err),它会发送一个401 Not Authorized给客户端。 如果您返回callback(null,用户),它将继续,直到下一个中间件function或适当的路线。