我试图研究这个问题的原因;这很可能是我对 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...
据我了解,没有引发错误,因为如果引发错误,我的 if
语句将会执行并将错误返回给用户。如果我在 url 中输入了一个虚假的 id,那么我会返回一个错误,但如果我粘贴一个已删除记录的 _id,则不会引发错误,并且执行会转到 else
block ,然后继续删除不存在的文档。甚至 .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
感谢您的帮助,请原谅任何新手的无知。
最佳答案
你得到的是一个 Javascript 错误而不是 Mongoose 错误,你试图在 null
上调用一个方法。 foo = null; foo.bar();
产生同样的错误。
找0个文件不是错误,执行了找的 Action 却找到了0个东西。
Mongoose 有一个辅助函数 findOneAndRemove ,你应该使用它,少写代码,少麻烦:
app.delete('/api/brothers/:id', function(req, res) {
Brother.findOneAndRemove({ _id: req.params.id }, function(err, brother, res) {
});
});
关于node.js - NodeJS 崩溃 : Mongoose findById() does NOT throw error when document is NOT found,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37234240/
相关文章:
javascript - Passport 没有保持持久的登录 session
linux - PHP升级到7后,为什么不能使用mongodb驱动?
python - 具有完整行对象的 Mongo Distinct Query
php - 在 Ubuntu 14 上将 PHP Mongo 扩展更新到 1.5
java - 使用 Spring Data 按提取的日期、月份和年份聚合项目组
mongodb - 按 id 对 Mongo 文档进行分组,并按时间戳获取最新文档
ruby-on-rails - 运行 Rails 应用程序时的 Mongo::Error::NoSe