在mongoose的query.exec()中进行适当的错误处理

7

我已经查看了Mongoose文档,但仍然找不到如何处理query.exec()中的错误信息。

var query = User.findOne({_id: userId});

    var promise = query.exec(function(err) {
        if (err) {
            res.json(err);
            return;
        }
    });
    promise.then(function(user) {
        res.json(user.name);
    });

当我传递错误的用户ID时,控制台上会打印出Unhandled rejection CastError: Cast to ObjectId failed错误。我原以为res.json(err)return语句足以正确处理这个错误并阻止它在控制台中显示,但事实并非如此。我该怎么做呢?

1
你正在使用 Promise,为什么不在 exec 中使用 catch 而不是回调函数呢? promise.catch(function(err){}) - Asif Saeed
@AsifSaeed 谢谢,这正是我需要知道的! - CorrieSparrow
我是第一个回答的,但什么都没得到 :D - Asif Saeed
抱歉,我刚刚给这条评论点了赞,但我也希望能将其作为答案接受 :) - CorrieSparrow
2个回答

14

使用回调函数:

var query = User.findOne({_id: userId});
query.exec(function (err) {
    if (err) {
        // handle error
        return;
    }
    // handle success
});

承诺:

var query = User.findOne({_id: userId});
query.exec().then(function () {
    // handle success
}).catch(function (err) {
    // handle error
});

目前你正在混合使用这两种样式。选择一种样式并坚持使用它。


这是可以的吗? await User.findOne({_id: userId}).exec() .then(function () { // 处理成功 }).catch(function (err) { // 处理错误 }); }``` 还是说 .exec() 已经使它成为异步了?@rsp - O'Dane Brissett
OP混合两种风格是有道理的。但是难道mongoose文档在这里也混合了它们吗?(链接:https://mongoosejs.com/docs/populate.html#population) - Zebiano

1
通过最小的代码更改:
var query = User.findOne({_id: userId});

    var promise = query.exec(function(err) {
        if (err) {
            res.json(err);
            return Promise.reject(err); // Updated this line
        }
    });
    promise.then(function(user) {
        res.json(user.name);
    });

正确使用 Promise:

User.findOne({_.id: userId})
  .then(function(user) {
    return res.json(user.name);
  })
  .catch(function(err) {
    return res.json(err);
  });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接