在向使用中间件的路由发出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 });
}
我只是想摆脱那个“错误:发送后无法设置标题。”在控制台中。 任何帮助表示赞赏!
答案 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()
。