无法理解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或适当的路线。