错误:发送后无法设置标头,来自中间件

时间:2018-05-21 00:15:48

标签: node.js express jwt

在向使用中间件的路由发出get请求时出现此错误。路由验证用户是否具有有效令牌并显示消息和一些基本用户信息。

信息被发送给最终用户就好了,但是,我一直在节点控制台中看到这些“无法设置标头错误”。我认为这与下一个()函数的误用有关。

这是我的代码:

user.js(路由器)

router.get('/me', VerifyToken, userController.me_get);

VerifyToken.js(中间件)

    module.exports = (req, res, next) => {
    var token = req.headers['authorization'];
    //Check if token used is undefined
    if(typeof token !== 'undefined') {
        jwt.verify(token, 'secretkey', (err, authData) => {
            if(err) {
                return next(res.json({ message : 'You are not authorized to be here'}));
            } else {
                var usertoken = {
                    id : authData.user._id,
                    username : authData.user.username
                }
                res.locals.usertoken = usertoken;
                return next();
            }
          });
        return next();
    } else {
        //Forbidden
        return next(res.sendStatus(403));
    }
}

users.js(控制器)

module.exports.me_get = (req, res, next) => {
  return res.json({ message : 'You have arrived!', usertoken : res.locals.usertoken });
}

我只是想摆脱那个“错误:发送后无法设置标题。”在控制台中。 任何帮助表示赞赏!

3 个答案:

答案 0 :(得分:0)

如果您使用res.json()(或发送回复的任何其他方法)发送回复,请不要致电next()next()将继续处理其他请求处理程序,其中一些可能会尝试发送另一个响应。由于每个请求只能发送一个响应,因此会出现您看到的错误。

一旦您发送了回复,只需返回即可。所有处理都在那时完成。

例如,替换它:

return next(res.json({ message : 'You are not authorized to be here'}));

用这个:

res.json({ message : 'You are not authorized to be here'});
return;

答案 1 :(得分:0)

如果您要结束请求,则不应致电.next。否则它将转到下一个中​​间件,它将再次结束请求,并且您将收到Error: Can't set headers after they are sent错误,因为您无法两次结束请求。

替换:

return next(res.sendStatus(403));

使用

return res.sendStatus(403);

return next(res.json({ message : 'You are not authorized to be here'}));

使用

return res.json({ message : 'You are not authorized to be here'});

答案 2 :(得分:0)

原来我在中间件的if块底部有一个额外的return next()

相关问题