Node.js 错误:can';t在发送邮件后设置邮件头
我想发送一个带有Node.js 错误:can';t在发送邮件后设置邮件头,node.js,express,Node.js,Express,我想发送一个带有res.redirect()的参数。但是,我在运行它时遇到了一个错误,说我无法在发送头之后设置头 这意味着什么,我该如何修复它 app.post('/updateCollaborateRequest', function(req,res) { if(req.body.accept == true) { Team.findOne({'name': req.body.data.teamName}, function (err, team) {
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')});
});
});
});
您的代码在重定向后继续。这可能就是问题所在。您应该返回,否则将继续尝试写入HTTP响应。此特定错误消息是由导致多次尝试发送响应的
res.xxx()
调用的代码路径引起的
你可以在多个地方这样做。例如,在Team.findOne()
回调中有两个res.redirect()
调用,但随后继续执行Request.findOne()
,其中有一个res.render()
。您必须确保只发送一次响应
我不完全确定在所有情况下所需的逻辑是什么,但您可以通过在Request.findOne()
之前添加else
语句,并在每个res.redirect()之后添加return
来修复该错误。如果这不是您想要的确切流程,那么请详细解释您希望控制流程如何工作。以下是应用这些更改的代码:
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')});
});
});
}
});
您仍然存在一些错误情况,没有发送响应,这是不完整的错误处理,因此这些情况也需要修复。此外,我还在代码中添加了一些关于代码中其他可疑内容的注释。除了这篇文章中被删掉的真正不可接受的乞讨之外,我注意到下面有两个答案仍然没有重复。当时他们有没有帮过你?我知道你已经-请允许我鼓励你与你收到的有用答案互动。值得考虑的是,这个网站的成功与否取决于它的社区精神以及它的游戏化。嗨,哈弗,我为我使用论坛提问的方式道歉。我当然不知道如何在stackoverflow提问,下次我会尽量记住这些问题。就我记忆所及,在这个问题上,这两个答案对我都没有帮助,而且已经很长时间了,所以我不知道当时正确的解决方案是什么。我可能会在这里说些显而易见的话,但他们试图帮助你,与他们互动、回复或投票支持努力是正常的。我认为这对Stack Overflow一点也不特别——表达感激之情难道不是普通人际交往的一部分吗?就我所记得的,他们试图帮助我,但还有别的办法解决了这个问题。还有你对回复的关注,我被这个项目抓住了,因为这是我最后一年的项目,所以忘了回复。