node.js - NodeJS 崩溃 : Mongoose findById() does NOT

我试图研究这个问题的原因;这很可能是我对 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 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

mongodb - Mongo在计算条件下排序

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

node.js - 关于 Mongoose 填充关系一个字符串字段

mongodb - Docker-MongoDB 中的身份验证问题