中间崩溃返回错误,无法设置标头

时间:2015-12-26 01:39:59

标签: javascript node.js express

我做了一个简单的auth自定义中间件但是出错了。我不知道发生了什么,我以为next()会解决我的问题?

    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.');
    ^

1 个答案:

答案 0 :(得分:0)

问题是即使next是假的,req.user也会被调用,因为在调用res.redirect后执行没有停止,next尝试在res.redirect之后设置标头{1}}已发出回复,只需将其替换为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
});