use*_*872 5 crash mongoose mongodb node.js express
我试着研究这个问题的原因; 这很可能是我对Mongoose工作方式的误解.我正在尝试用REST风格创建一个CRUD后端.GET,PUT,POST似乎都有效.但是,我对DELETE动词的问题有点不知所措.
我和Postman一起把一些假数据输入mongo,一切顺利.所以我复制了我的一个记录的_id字段并尝试删除.当我发送DELETE请求时,成功消息通过,记录确实已从mongo中删除.但是,在删除其他记录后,我决定尝试使用已删除的文档的_id删除记录.
我向'api/brothers/57280602953cff031f21ad9c'发送了DELETE请求
原来NodeJS崩溃了!
这是相关的服务器代码:
// DELETE a brother by id
app.delete('/api/brothers/:id', function(req, res) {
Brother.findById(req.params.id, function(err, brother) {
if (err) {
// error finding brother
res.json(err);
} else {
// remove record
brother.remove(function(err, brother) {
if (err) {
// error removing!
res.send(err);
} else {
// successful DELETE!
res.json({
message : "successfully deleted",
brother : brother
});
}
});
}
});
});
Run Code Online (Sandbox Code Playgroud)
Nodejs崩溃,我的控制台窗口返回以下内容:
TypeError: Cannot read property 'remove' of null
[nodemon] app crashed - waiting for file changes before starting...
Run Code Online (Sandbox Code Playgroud)
根据我的理解,没有抛出错误,因为如果它被抛出,我的if语句将执行并将错误返回给用户.如果我在url中输入了一个伪造的id,那么我会收到一个错误,但是如果我粘贴了一个已经删除的记录的_id,则不会抛出错误,并且执行会移动到该else块,并继续删除文档那不存在.甚至不.remove()似乎捕获错误...服务器刚刚崩溃.
那么......我的问题是为什么?它与Mongo有什么关系_id吗?为什么不抛出错误?为什么服务器崩溃.
如果我修改if语句不仅捕获错误,而且还检查是否存在brother从findById()函数返回的错误,则会将错误返回给用户并避免灾难:
if (err || !brother) {
// THIS WORKS
res.json(brother);
} else { ...
Run Code Online (Sandbox Code Playgroud)
再次......为什么?为什么如果brotherobj为null,Mongoose甚至会尝试删除文档?为什么服务器崩溃?
//我正在使用Express 4.13.4和Mongoose 4.4.12
感谢您的帮助,并原谅任何新手的无知.
您得到的是 Javascript 错误而不是 Mongoose 错误,您试图在null. foo = null; foo.bar();产生相同的错误。
查找 0 文档不是错误,执行查找操作但找到了 0 事物。
Mongoose 有一个辅助函数findOneAndRemove,你应该使用它,少写代码,少头疼:
app.delete('/api/brothers/:id', function(req, res) {
Brother.findOneAndRemove({ _id: req.params.id }, function(err, brother, res) {
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2992 次 |
| 最近记录: |