我正在尝试学习Express会话和身份验证处理。
例如:
app.post('/login', authCredentials, function(req, res) {
console.log("second")
});
function authCredentials(req, res, next) {
//this happens first
console.log(req.body) // => { username: etc, password: etc }
next();
}
我的问题是
authCredentials
函数应该做什么?例如,如果凭据正确,我可以做类似的事情
res.redirect('/index')
。但是,一旦执行此操作,第二个功能有什么目的?其他问题:
我将如何处理无效的凭证?
如果我使
authCredentials
根据凭据返回true
或false
,这不会中断中间件流程,因为它永远不会调用next()
吗?之后,是否可以在匿名回调中访问
authCredentials
中的任何内容?基本上在function(req, res) { }
中? 最佳答案
您想将authCredentials
中间件添加到每个需要身份验证的端点。 app.post('/login')
通常不需要任何内容,因为您首先要访问此端点才能真正获得凭据。
当凭据正确/有效时,您只需调用next()
,工作流将跳转到下一个中间件或实际端点。如果发生错误,请使用错误对象(例如next()
)调用next(new Error('could not authenticate');
。将错误路由添加到您的常规路由,该错误将在那里处理:
app.use(function(err, req, res, next) {
res.render('error', err);
});
现在应该回答。
中间件不返回值。它要么调用
next()
,要么通过调用res.send()
结束进程。有多种方法可以将变量从一种中间件传递到另一种中间件。最常见的可能是将所需的值附加到
req
参数。在以下示例中,
authenticate
是一个异步函数:function authCredentials(req, res, next) {
authenticate(req.body, function(err, user) {
if (err) {
return next(err);
}
req.user = user;
next();
});
}