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()
直到您检索到用户,您的调用才会被调用,即使您对user
inside没有任何作用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] 删除。
我来说两句