Javascript 未调用PassportJS自定义身份验证回调

Javascript 未调用PassportJS自定义身份验证回调,javascript,node.js,express,passport.js,Javascript,Node.js,Express,Passport.js,更新:以下错误已由修复。我已将第一个答案标记为“正确”,尽管在其中一条评论中我注意到了提交 我希望利用自定义回调来处理Passport中登录的成功和失败,但它似乎只在成功时调用 下面是我所说的一个片段: passport.use(new LocalStrategy( {usernameField: 'email', passwordField: 'password'}, function(email, password, done) { if(canLogin)

更新:以下错误已由修复。我已将第一个答案标记为“正确”,尽管在其中一条评论中我注意到了提交

我希望利用自定义回调来处理Passport中登录的成功和失败,但它似乎只在成功时调用

下面是我所说的一个片段:

passport.use(new LocalStrategy(
    {usernameField: 'email', passwordField: 'password'},
    function(email, password, done) {
        if(canLogin) done(null, user);
        else done({message: "This is an error message" }, false, { message: "Some Info" });
    }
));


app.post('/login', function(req, res, next) {
      passport.authenticate('local', function(err, user, info) {
         // Only called if err is not set
    });

你知道为什么会这样吗?我的印象是会调用回调,这样我就可以自己处理错误。

如果您想传播身份验证失败(用户名/密码不匹配),您不应该生成错误,而是将
用户设置为
false
,并传递原因:

passport.use(new LocalStrategy(
  {usernameField: 'email', passwordField: 'password'},
  function(email, password, done) {
    if (canLogin)
      done(null, user);
    else 
      done(null, false, { message: 'Invalid login credentials' });
  }
));
...
app.post('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (user === false) {
      // handle login error ...
    } else {
      // handle successful login ...
    }
  })(req, res, next);
});

err
是为身份验证过程中发生的异常保留的,例如,如果您遇到数据库错误等。但是,尽管Passport文档建议将这些错误传递给Passport.authenticate回调,但它们似乎没有传递(这就是它不适用于您的原因)。

是的,只是将这些作为示例。那么,我想没有解决办法了?@funseiki查看Passport代码,“正确的”错误是沿着中间件链传递的,而不是回调。恐怕除了设置一个全局快速错误处理程序来处理这些错误之外,您对此无能为力。如果提供了自定义回调,那么错误现在会传播到它。有关更多信息,请参见此处:@robertklep我在passport.authencate中获取的错误、用户、信息为null、false、缺少凭据。我没有将用户设置为false。你能研究一下我的问题吗