【发布时间】:2016-09-11 01:57:12
【问题描述】:
我试图研究这个问题的原因;这很可能是我对 Mongoose 工作方式的误解。我正在尝试以 REST 样式创建 CRUD 后端。 GET、PUT、POST 似乎都有效。但是,对于 DELETE 动词的问题,我有点不知所措。
问题
我用 Postman 将一些假数据输入到 mongo 中,一切顺利。所以我复制了一条记录的_id 字段并尝试删除。当我发送 DELETE 请求时,成功消息传来,记录确实从 mongo 中删除。但是,在删除其他记录之后,我决定尝试删除一条我已经删除的文档的_id 记录。
我向“api/brothers/57280602953cff031f21ad9c”发送了一个删除请求
原来 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
});
}
});
}
});
});
Nodejs 崩溃,我的控制台窗口返回以下内容:
TypeError: Cannot read property 'remove' of null
[nodemon] app crashed - waiting for file changes before starting...
为什么 Mongoose 没有抛出错误?
据我了解,没有引发错误,因为如果引发错误,我的 if 语句将执行并将错误返回给用户。如果我在 url 中输入了一个虚假的 id,那么我会返回一个错误,但如果我粘贴一个已删除记录的 _id,则不会引发错误,并且执行会转到 else 块,然后继续删除不存在的文档。甚至.remove() 似乎都没有发现错误......服务器只是崩溃了。
所以...我的问题是为什么?是否与 Mongo 投射 _id 有关?为什么不抛出错误?服务器为什么会崩溃。
某种解决方案...
如果我修改if 语句,不仅要捕获错误,还要检查从findById() 函数返回的brother 是否存在,错误会返回给用户,灾难是避免:
if (err || !brother) {
// THIS WORKS
res.json(brother);
} else { ...
再次...为什么?为什么如果 brother obj 为 null,Mongoose 甚至会尝试删除文档?服务器为什么会崩溃?
// 我使用的是 Express 4.13.4 和 Mongoose 4.4.12
感谢您的帮助,请原谅任何新手的无知。
【问题讨论】:
标签: node.js mongodb express mongoose crash