我做了一个简单的auth自定义中间件,但出现了错误。我不知道发生了什么,我以为下一个()会解决我的问题吗?
app.use(function(req, res, next){
if(req.user){
res.locals.username = req.user.username
}else{
res.redirect('/login');
}
next();
});
router.get('/login', function(req, res, next) {
res.render('login');
});
我的错误
_http_outgoing.js:335
throw new Error('Can't set headers after they are sent.');
^
问题是,即使req.user
失败,也会调用next
,因为调用res.redirect
后执行不会停止,next
在res.redirect
发出响应后尝试设置标头,所以只需将其替换为return res.redirect('/login')
,就可以继续了。
EDIT在这种情况下,中间件在每个路由上运行,导致循环问题,因为登录路由也需要进行身份验证,可以这样修复。
function auth(req, res, next) {
// authenticate and call next or redirect
}
router.get('/login', function(req, res) {
res.render('login');
});
router.get('/authentic', auth, function(req, res) {
// body
});