Jquery passport.js-401错误后访问失败消息

Jquery passport.js-401错误后访问失败消息,jquery,node.js,express,passport.js,http-status-code-401,Jquery,Node.js,Express,Passport.js,Http Status Code 401,目前,我可以通过req.authInfo访问post请求内部done(null,user,{message:'ok'})中设置的消息,如下所示: app.post('/reg', passport.authenticate('local-reg', { session: false }), function (req, res) { console.log(req.authInfo.message); --> 'ok' }); 这非常有用

目前,我可以通过
req.authInfo
访问post请求内部
done(null,user,{message:'ok'})中设置的消息,如下所示:

app.post('/reg', passport.authenticate('local-reg', { session: false }), function (req, res) {        
        console.log(req.authInfo.message); --> 'ok'         
});
这非常有用。
但我如何才能以相同的方式访问这样的消息
done(null,false,{message:'username take'})
,因为在passport.authenticate中传递
done(null,false)
似乎会使其抛出401未经筛选,因此不会转发到路由处理程序本身。
也许我误解了什么


附言:我是通过jQuery发布的。每个人都有自己的实现方式。在我的实现中,如果没有错误且登录成功,则:

返回完成(null,{type:true,数据:{email:,role:,name:},token:})

然而,如果有任何错误或不成功的登录,那么我会这样做

returndone(null,{type:false,数据:'电子邮件已被接收')

因此,这使我的工作更简单,我只检查
类型
值,我可以使用它传递值和错误消息。

您应该在可以访问
信息的地方使用:

app.post('/req', function(req, res, next) {
  passport.authenticate('local-reg', {session: false}, function(err, user, info) {
    if (err) {
      return next(err);
    }
    if (!user) {
      return res.json(info);
    }
    req.logIn(user, function(err) {
      if (err) {
        return next(err);
      }
      return res.json(info);
    });
  })(req, res, next);
});
req.authInfo
仅在成功登录后设置。如果您正在使用会话,则可以使用带有重定向的flash消息,例如:

app.post('/reg', passport.authenticate('local-reg', {
  successRedirect: '/',
  failureRedirect: '/',
  failureFlash: true,
  successFlash: true
}));

app.get('/', function(req, res) {
  res.json(req.flash());
});

是的,我考虑过这种方法,但实际上这是一种变通方法,即对成功和失败案例都使用successfull done。在我的情况下会有用的。但我很好奇,为什么有可能在第三个参数中传递消息,如果它在任何地方都不能被传递,以防失败。这个失败的例子几乎是这个消息最需要的例子。谢谢你的建议,但我决定采用下面的自定义回调思想,因为这对我来说意味着更少的代码重写,但看到有人以这种方式实现它也很有趣。谢谢你,它帮助了你,让我知道你们是否找到更好的方法来实现同样的功能。我正在使用会话,但仅仅为了完成这样一个简单的任务而连接整个flash messages模块感觉太过火了。我将尝试一个自定义回调,它让我感觉到更少的变通方法,更少的代码行需要更改。我会检查它,然后接受一个答案(只是想把它打开一点,以防出了什么问题或者其他有趣的答案会出现。)。谢谢你的回复,这个方法似乎很好用。作为旁注,我知道这不是答案中的重点,但不是
req。logIn
用于将用户反序列化到会话中,因此在示例中使用它与
session:false
没有意义?再次感谢)我相信
req.logIn
也一样。如果
options.session
false
,则不会执行反序列化。
app.post('/reg', passport.authenticate('local-reg', {
  successRedirect: '/',
  failureRedirect: '/',
  failureFlash: true,
  successFlash: true
}));

app.get('/', function(req, res) {
  res.json(req.flash());
});