我有一个简单的护照设置,我的登录路线采用local
策略。我不知道如何正确使用身份验证功能作为中间件。这是我在控制器之前调用/login
路由的中间件:
exports.requireLogin = (req, res, next) => {
passport.authenticate('local', { session: false }, (err, user, info) => {
if (err) {
next(err);
} else if (!user) {
res.status(401).json(info.message);
} else {
req.login(user, (loginError) => {
if (loginError) {
console.log('error here');
next(new Error('test'));
} else {
next();
}
});
}
})(req, res, next);
};
如您所见,使用中间件参数立即调用护照功能。这就是我在Stackoverflow上发现的如何在该函数中使用next。
现在由于某种原因不起作用。该错误并未真正处理为错误。我通过将一个无错误的中间件作为express中的最后一个可能端点并将其记录下来来检查这一点。我可以看到它在错误传递到error here
的行之前注销了next
,但它也会在之后检查正常中间件被调用的检查。
据我所知,当您将错误传递给下一个时,Express不应该调用任何正常的中间件。为什么这个例子不起作用?