我想发送res.redirect()
的参数。但是,我在运行时遇到错误,说我发送后无法设置标头。
这是什么意思,我该如何解决?
app.post('/updateCollaborateRequest', function(req,res) {
if(req.body.accept == true) {
Team.findOne({'name': req.body.data.teamName}, function (err, team) {
if(err) {
res.redirect('/explore');
}
team.accepted = true;
team.save(function (err) {
if (err) {
alert(err);
}
Request.findOne({'emailAdmin': req.session.email}, function(err, request) {
request.seen = true;
request.save(function(err) {
if(err) {
console.log(err);
}
});
});
res.redirect("/teamprof/" + team.name);
});
});
}
Request.findOne({'emailAdmin': req.session.email}, function(err, request) {
request.seen = true;
request.save(function(err) {
if(err) {
console.log(err);
}
res.render('userprof1', {message : req.flash('done')});
});
});
});
答案 0 :(得分:1)
重定向后,您的代码仍在继续。这可能就是问题所在。您应该返回,否则您将继续尝试写入HTTP响应。
答案 1 :(得分:1)
此特定错误消息是由导致多次res.xxx()
调用的代码路径引起的,这些调用尝试多次发送响应。
你有多个地方在做这件事。例如,您在res.redirect()
回调中有两个Team.findOne()
来电,但接着Request.findOne()
继续res.render()
。您必须确保只发送一次响应。
我并不完全确定在所有情况下所需的逻辑是什么,但您可以通过在else
之前添加Request.findOne()
语句并在每个之后添加return
来修复该错误res.redirect()
。如果这不是您想要的确切流程,请详细说明您希望控制流如何工作。这是应用了这些更改的代码:
app.post('/updateCollaborateRequest', function(req,res) {
if(req.body.accept == true) {
Team.findOne({'name': req.body.data.teamName}, function (err, team) {
if(err) {
res.redirect('/explore');
return;
}
team.accepted = true;
team.save(function (err) {
if (err) {
// FIXME: need error handling here
alert(err);
}
Request.findOne({'emailAdmin': req.session.email}, function(err, request) {
request.seen = true;
request.save(function(err) {
if(err) {
// FIXME: need error handling here
console.log(err);
}
});
});
// Are you sure you want to send this response before
// you even know if the `Request.findOne()` and `request.save()`
// have been sucessful?
res.redirect("/teamprof/" + team.name);
return;
});
});
} else {
Request.findOne({'emailAdmin': req.session.email}, function(err, request) {
request.seen = true;
request.save(function(err) {
if(err) {
console.log(err);
}
res.render('userprof1', {message : req.flash('done')});
});
});
}
});
您仍然有几个错误条件,没有响应发送,这是不完整的错误处理,所以那些也需要修复。而且,我在代码中添加了一些关于代码中其他可疑内容的注释。