Javascript 如何使用passport local登录用户并显示错误消息?

Javascript 如何使用passport local登录用户并显示错误消息?,javascript,node.js,authentication,passport.js,passport-local,Javascript,Node.js,Authentication,Passport.js,Passport Local,因此,我一直在尝试在我的VueJs应用程序上使用PassportJs编写身份验证系统。我编写了一个函数来初始化PassportJs的基本功能,如下所示: module.exports = { passport: function () { authenticateUser = async (email, password, done) => { User.findOne({ email: email }, async (err, user) => {

因此,我一直在尝试在我的VueJs应用程序上使用
PassportJs
编写身份验证系统。我编写了一个函数来初始化
PassportJs
的基本功能,如下所示:

module.exports = {
  passport: function () {
    authenticateUser = async (email, password, done) => {
      User.findOne({ email: email }, async (err, user) => {
        if (user == null) return done(null, false, { msg: 'No user registered with this email' })

        try {
          if (await bcrypt.compare(password, user.password)) {
            return done(null, user)
          } else {
            return done(null, false, { msg: "Password incorrect" })
          }
        } catch (e) {
          return done(e)
        }
      })
    }

    passport.use(new LocalStrategy({ usernameField: 'email', }, authenticateUser));
    passport.serializeUser((user, done) => {
      console.log('passport serializeUser')
      done(null, user.id)
    })

    passport.deserializeUser((id, done) => {
      console.log('passport deserializeUser')
      User.findById(id, (err, user) => {
        done(err, user)
      })
    })
  },
};
现在,我只需要在前端显示正确的错误消息

此代码用于显示错误消息,但不适用于实际登录用户:

router.post('/login', function (req, res, next) {
  passport.authenticate('local', function (err, user, info) {
    if (err) { return next(err); }
    if (!user) {
      console.log('mand?????: ', info)
      res.status(401).json({ msg: info.msg });
      return;
    }
  })(req, res, next);
});
我可以看到此代码运行
(等待bcrypt.compare(password,user.password))
,但它不会序列化用户。请求只是保持“挂起”,但未完成

此代码用于实际登录用户,但不用于显示错误消息:

router.post('/login', passport.authenticate('local'))

我哪里做错了?如何成功登录用户,同时显示passportjs的
done()
函数中声明的正确错误消息?

请查看
passport
文档中的
authenticate()
方法

使用自定义回调时,它将成为应用程序的 负责建立会话(通过呼叫)和 发送响应

因此,在第一个场景中,您需要明确地建立会话—passport不会自动为您建立会话

关于不使用自定义回调的第二个场景:

默认情况下,如果身份验证失败,Passport将以401响应 未经授权的状态,任何其他路由处理程序都不会被删除 调用

据我所知,通过此设置,作为
策略的一部分设置的闪存消息
验证回调不会被使用-除非指定了
重定向
选项,您不希望在此处使用这些选项

因此,您可能应该使用第一个场景,以便能够使用
策略
验证回调闪存消息来定制错误响应。只要确保登录成功后建立会话即可

编辑:我刚刚通过了一个快速测试,另外,您也可以通过将
策略
验证回调返回错误,将
error.message
属性设置为要作为响应发送的任何错误消息,而不需要自定义回调和闪存消息。请注意,在这种情况下,passport实际上将错误消息的响应正文设置为文本

因此,例如,而不是:

done(null, false, { msg: 'No user registered with this email' })
你会做:

done(new Error('No user registered with this email')

谢谢你的详细解释!我应该更彻底地阅读文档。最后我完成了
(新的错误('No user registed with this email')
。这似乎是一个很好的解决方法:)。谢谢!