当我尝试刷新特定页面时,我收到错误:发送后无法设置标题。现在,当我实际点击该页面的链接时,它不会发生。我在请求期间彻底查看了事件链。中间件和请求似乎没有导致res.end()被调用两次。
每次请求都会调用中间件:
projectRouter.use(function(req, res, next) {
var token = req.body.token || req.params.token || req.headers['x-access-token'];
console.log(token);
if (token) {
jwt.verify(token, superSecret, function(err, decoded) {
if (err) {
res.status(403).send({
success: false,
message: 'Failed to authenticate token.'
});
} else {
req.decoded = decoded;
next();
}
});
} else {
res.status(403).send({
success: false,
message: 'No token provided'
});
next();
}
});
请求错误发生在:
projectRouter.route('/projects/:proj_id')
.get(function(req, res) {
Project.findById(req.params.proj_id, function(err, project) {
if (err) { res.send(err); return; }
res.json(project);
});
})
我在前端使用角度,并使用拦截器将用户令牌写入x-access-token。因此,当发生此错误时,中间件无法获取令牌,从而导致该页面上的403。我一直在努力解决这个问题几天而且不知所措。我想这件事真的很蠢。
答案 0 :(得分:0)
} else {
res.status(403).send({
success: false,
message: 'No token provided'
});
next();
}
您的else
区块正在发送回复并且还在呼叫next()
,这意味着它会发送错误并尝试运行您的路线并发送回复。由于两者都试图发送响应,您将收到错误。