我正在尝试使用 Passport.js 中间件来注册和登录用户。我想使用带有 express-validator 的注册用户路由。我可以使用 mongoose 做到这一点,但是 sequelize(Postgres 方言)给了我错误。
这是我的“注册”策略:
passport.use(
'register',
new localStrategy(
{
usernameField: 'username',
passwordField: 'password',
passReqToCallback: true,
},
async (req, username, password, done) => {
try {
const user = await models.user.create(req.body);
return done(null, user);
} catch (error) {
done(error);
}
}
)
);
然后是 /register 路由本身(省略了大部分验证器):
router.post(
'/register', [
body('username').trim().isLength({ min: 1 }).withMessage('Username is required').escape(),
async (req, res, next) => {
const errors = validationResult(req);
if (!errors.isEmpty()) {
return res.json({ errors: errors.array() })
} else {
await passport.authenticate('register', { session: false })(req, res, next);
return res.json({
message: 'Signup successful',
user: req.user.username
});
}
}
]
);
一些事情:
router.post(
'/register',
passport.authenticate('register', { session: false }),
async (req, res, next) => {
res.json({
message: 'Signup successful',
user: req.user.username
});
}
);
(node:3353) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'username' of undefined
并且服务器给出“无法POST /注册”错误。
如果我从返回的对象中删除 req.user.username 属性,它工作正常。即使有了它,记录确实是在数据库中创建的。但似乎 res.json 会在调用 Passport.authenticate 之前返回,即使它位于 async/await 块中。
对正在发生的事情的想法?
非常感谢!