NodeJS崩溃:当找不到文档时,Mongoose findById()不会抛出错误

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)

为什么不是Mongoose抛出的错误?

根据我的理解,没有抛出错误,因为如果它被抛出,我的if语句将执行并将错误返回给用户.如果我在url中输入了一个伪造的id,那么我会收到一个错误,但是如果我粘贴了一个已经删除的记录的_id,则不会抛出错误,并且执行会移动到该else块,并继续删除文档那不存在.甚至不.remove()似乎捕获错误...服务器刚刚崩溃.

那么......我的问题是为什么?它与Mongo有什么关系_id吗?为什么不抛出错误?为什么服务器崩溃.

一种解决方案......

如果我修改if语句不仅捕获错误,而且还检查是否存在brotherfindById()函数返回的错误,则会将错误返回给用户并避免灾难:

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

感谢您的帮助,并原谅任何新手的无知.

Sha*_*oor 5

您得到的是 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)