nodejs mongoose删除匹配错误:发送后无法设置标头
问题描述:
我正在使用猫鼬来读取和更新并删除一些文档。
找到并更新和删除工作正常。除了最后一个data.remove();
未被删除并且出现错误。在代码的最后nodejs mongoose删除匹配错误:发送后无法设置标头
res.status(200).json({
success: true
});
:
我在我下面的代码得到这个错误:
events.js:160
throw er; // Unhandled 'error' event
^
Error: Can't set headers after they are sent.
,它指向的线。
router.post('/some/route', function (req, res) {
if (req.isLoggedIn()) {
return res.status(403).json({});
}
MyModel.findById(req.user._id,function (err, data) {
if(err || data.rights !== 'super'){
return res.status(403).json({});
}
if(req.body.writer){
Books.update(
{ writer : req.body.id},
{ $set : { writer : req.body.writer} },
function (err) {
if(err){
res.status(500).send(err);
}
else{
res.status(200).send('updated successfully.');
}
}
);
}else{
Books.remove({writer: req.body.id}, function(err){
if (err){ return console.log(err)}
});
}
MetaInfo.findOneAndRemove({_id: req.body.id}, function (err, data) {
console.log(err);
});
Archive.findOne({_id: req.body.id},function (err, data) {
smtpTransporter.sendMail({...}, function (error, response) {
if (error) {
console.log(error);
} else {
console.log("Mail sent");
}
smtpTransporter.close();
});
data.remove();
if (err) {
console.log(err);
return res.status(200).json({
success: false,
message: 'server error',
err: err
});
}
res.status(200).json({
success: true
});
})
});
});
答
基本上,当你做res.send或res.json时,它会设置响应头。当javascript发现另一个res.send在一个之后执行时,它会引发错误,表明头文件已经设置。
确保您每次都返回res.send或json,或者您正在使用适当的if else语句。
要阐述:
例1:
app.get('/', (req, res) => {
if(true){
res.send('first');
}
res.send('second');
});
这将在控制台抛出错误。
实施例2:
app.get('/', (req, res) => {
if(true){
return res.send('first');
}
res.send('second');
});
无错误抛出。
实施例3:
app.get('/', (req, res) => {
if(true){
res.send('first')
}
else{
res.send('second');
}
});
无错误抛出。
最可能的问题是res.status/send之一已在该语句之前执行。在每个res.status语句之前尝试和console.log,以便您可以跟踪代码已分支的语句的所有条件块。 –