我正在尝试学习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根据凭据返回truefalse,这不会中断中间件流程,因为它永远不会调用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();
    });
}

09-16 02:53