在passport.authenticate('local')

时间:2017-11-20 18:06:10

标签: javascript express passport.js

我有一些使用passport.js的中间件,它旨在验证用户身份,然后转移到下一个中​​间件:

exports.authenticate = (req, res, next) => {
  passport.authenticate('local', (err, user, info) => {
    console.log('You are authenticated!!')
    next()
  })(req, res, next)
}

当用户注册时,我在控制台中看到You are authenticated!!。因此,通过这种逻辑,用户应该附加到req。所以我打电话给next然后移动到这个中间件上(我想在重定向用户之前做一些其他事情):

exports.createMatch = async (req, res) => {
  console.log(req.user._id)
}

但是,我的控制台和网页上的错误显示为TypeError: Cannot read property '_id' of undefined。为什么会这样,我该如何纠正呢?

routes.js:

router.post(
  '/register',
  userController.validateRegistration, // validate them
  userController.register, // register them to the db
  authController.authenticate, // authenticate them
  catchErrors(dataController.createMatch) // do some other bits then redirect
)

快递相当新。如果需要更多代码,请告诉我。如果类似的东西在其他地方得到回答,请道歉。

此致 詹姆斯。

1 个答案:

答案 0 :(得分:1)

这是源req.user设置的行:

https://github.com/jaredhanson/passport/blob/821a474342b1ae900849911b5c3d3ccc4ef5ab86/lib/http/request.js#L44

它在方法req.login中。文档在这里:

http://www.passportjs.org/docs/login

它声明:

  

登录操作完成后,user将分配给req.user

进一步说:

  

passport.authenticate()中间件会自动调用req.login()

到目前为止,一切听起来都应该有效......

但是,如果您阅读了有关提供自定义回调的部分,这就是您正在做的事情,则说明:

  

请注意,使用自定义回调时,应用程序负责建立会话(通过调用req.login())并发送回复。

有几种方法可以解决它。你可以摆脱自定义回调,你可以在回调中调用login,或者你可以自己设置req.user = user