can'的中间崩溃返回错误;t设置标题

middle crashed returning error of can't set headers

本文关键字:错误 设置 标题 返回 中间 can 崩溃      更新时间:2023-09-26

我做了一个简单的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后执行不会停止,nextres.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
});