mongodb崩溃节点,尝试捕获内有异常

瞬变循环
try
    p = req.params.name
    Item.update('name': p, req.body , {upsert: true}, (err) ->
      if err?
        throw err
      res.send("ok")
      )
  catch e
    handle_error(e, "Error salvando hoja de vida.", res)

这会立即在我的代码中产生一个错误-没问题,但是即使我在这里尝试捕获,为什么我的nodejs程序也会崩溃?

错误是:

MongoError: Mod on _id not allowed

(因此必须在更新调用中)我正在特别寻找一种捕获错误的方法,我已经知道如何消除它。

雪佛兰

是的,您已经进入了异步代码领域。之所以将回调传递到MongoDB调用中,Item.update(..., callback)是因为MongoDB驱动程序被编写为异步的。考虑以下(猫鼬代码):

var user = User.findOne({ name: 'joe' });
doSomethingElse();

如果它的结构像上面的代码一样,那么您的整个应用程序将暂停,直到User.findOne()从数据库返回结果为止doSomethingElse()直到您检索到用户,您的调用才会被调用,即使您对userinside没有任何作用doSomethingElse如今这是一个很大的问题,尤其是在已被编写为尽可能异步的节点中。看看以下内容:

User.findOne({ name: 'joe' }, function (err, user) {
    if (err) return console.error(err);
    console.log('Do stuff with user... ;)');
});
doSomethingElse();

上面的代码是异步的。findOne函数会立即返回并且doSomethingElse甚至可以在从数据库中检索到用户之前就可以开始。但是当然,我们仍然想对用户进行处理,因此,为了实现此目的,我们传入一个匿名函数以用作回调。MongoDB驱动程序足够聪明,可以在检索完所有数据后调用该函数。

将上面的代码包装在try / catch中将是没有意义的,除非您怀疑findOne函数会引发异常(这不应该。它立即返回还记得吗?)。

try {
    User.findOne({ name: 'joe' }, function (err, user) {
        throw new Error("Something went wrong...");
    });
} catch (err) {
    console.error(err);
}

上面的错误仍然会使您的程序崩溃,因为它在findOne返回很长时间后发生,并且您的程序超出了宝贵的尝试/捕获范围。这就是您的回调函数接收err参数的原因。MongoDB驱动程序知道,如果在获取数据时发生一些错误,则抛出异常并调用它是不好的。这是因为所有这些处理都是在事件循环的后续行程中稍后进行的,而将try / catch留在了几次迭代之后。

为了解决这个问题,MongoDB驱动程序将自己的内部同步代码包装在try / catch中,该代码实际上将处理异常,然后调用您的回调,并将错误作为第一个参数传递。这使您可以检查该参数并处理回调中的任何错误。

我写了整篇博客文章来解释回调,以及另一种称为“ promises”的异步代码处理方式,我认为这将为您澄清一些问题:) http://codetunnel.io/what-are-callbacks-and -承诺

我希望这有助于回答您的问题。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何尝试/捕获所有异常

来自分类Dev

Scala:静默捕获所有异常

来自分类Dev

Java线程捕获所有异常?

来自分类Dev

带有异常捕获的春季交易

来自分类Dev

在 Unity 中捕获所有异常

来自分类Dev

捕获类中的所有异常

来自分类Dev

捕获后继续尝试阻止。将所有异常记录在一次try catch中

来自分类Dev

为什么catch语句不能捕获所有异常?

来自分类Dev

如何捕获Web API 2中的所有异常?

来自分类Dev

如何捕获PL / SQL脚本中的所有异常?

来自分类Dev

捕获除AsyncException之外的所有异常

来自分类Dev

捕获Javascript类方法中的所有异常

来自分类Dev

如何使用CherryPy捕获所有异常?

来自分类Dev

捕获网络问题中的所有异常

来自分类Dev

从 Android 中的线程捕获所有异常

来自分类Dev

在Java中进行错误处理时,应该捕获异常以捕获所有异常还是单独捕获异常?

来自分类Dev

尝试/捕获崩溃255

来自分类Dev

有异常的覆盖方法

来自分类Dev

捕获所有异常以进行详细日志记录-优点和缺点

来自分类Dev

捕获所有异常并在Jersey中返回自定义错误

来自分类Dev

捕获服务结构ReceiveReminderAsync中未处理的所有异常的正确方法是什么

来自分类Dev

拦截C#中的所有异常,即使它们已经被捕获

来自分类Dev

QTimer单发,在捕获中传递带有异常的lambda

来自分类Dev

什么是正确的错误类,可用于捕获pyxb中CreateFromDocument的所有异常

来自分类Dev

捕获所有异常以进行详细日志记录-优点和缺点

来自分类Dev

如何在Rails视图(.erb文件)中捕获和记录所有异常

来自分类Dev

如何捕获WCF中的所有异常但包括自定义数据?

来自分类Dev

尝试/捕获未捕获异常

来自分类Dev

尝试/捕获不捕获异常

Related 相关文章

热门标签

归档