我有一些使用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
)
快递相当新。如果需要更多代码,请告诉我。如果类似的东西在其他地方得到回答,请道歉。
此致 詹姆斯。
答案 0 :(得分:1)
这是源req.user
设置的行:
它在方法req.login
中。文档在这里:
http://www.passportjs.org/docs/login
它声明:
登录操作完成后,
user
将分配给req.user
。
进一步说:
passport.authenticate()
中间件会自动调用req.login()
。
到目前为止,一切听起来都应该有效......
但是,如果您阅读了有关提供自定义回调的部分,这就是您正在做的事情,则说明:
请注意,使用自定义回调时,应用程序负责建立会话(通过调用
req.login()
)并发送回复。
有几种方法可以解决它。你可以摆脱自定义回调,你可以在回调中调用login
,或者你可以自己设置req.user = user
。