我有一个node.js应用程序,Express用于路由,Mongoose用于数据库访问。
我有这个HTTP DELETE请求,如果满足某些要求,则会删除数据库中的条目。
.delete(function (req, res) {
Movie.findOne({_id: req.params.id
}, function (err, movie) {
if (err)
res.send(err);
for (var i = 0, len = movie.actors.length; i < len; i++) {
if (movie.actors[i].actor == "Chuck Norris"){
res.status(403).send({ message: 'Cannot delete Chuck Norris' });
}
else {
Movie.remove({_id: req.params.id
}, function (err, movie) {
if (err)
res.send(err);
res.json({message: 'Movie deleted'});
});
}
}
});
});
如果我发送带有电影ID的HTTP DELETE,它会检查演员列表中是否有Chuck Norris在电影中,如果他在那里我会阻止删除。
问题是我的控制台正在向我回复此错误:
Error: Can't set headers after they are sent.
所以我认为这是我的回调问题。由于node.js的异步特性,&#34;慢&#34;数据库调用使我的.delete在findOne完成之前发送了头文件?
如何在删除前设置验证并在无法删除时发送正确的http错误代码?
答案 0 :(得分:1)
在同一范围内多次响应请求时要小心。如果出现错误,您应该将return
添加到res.send(err)
,以便执行不会继续执行。对于for循环中的res.status()
也是如此。