node.js:抛出错误,不被捕获

我有一个使用swagger在node.js上集成了express的API和一个定义如下的资源。 swagger的默认error handling程序会捕获到(!req.params.id)检查中出现的大错误。 从mongoDB删除调用callback中引发的错误不会被捕获,给我下面的错误。 这个错误看起来像是和callback函数的范围/顺序有关,作为node.js的新手,我希望得到如何正确执行这个操作的build议,以保持asynchronous性。 -谢谢

events.js:74 throw TypeError('Uncaught,unspecified“error”event。'); ^ TypeError:未捕获,未指定的“错误”事件。

exports.remove = { 'spec' : { "collapsed...for...brevity..." : "...", "params" : [ { "paramType" : "path", "name" : "id", "collapsed...for...brevity..." : "...", }], "errorResponses" : [ swe.notFound('id'), swe.invalid('id') ], "nickname" : "remove" }, 'action' : function(req, res) { if (!req.params.id) { throw swe.invalid('id'); // THIS ERROR IS CAUGHT } req.coll.remove({_id : req.coll.id(req.params.id)}, function(e, result) { if (e) { throw swe.invalid('collection'); // THIS ERROR IS NOT CAUGHT } res.send({msg : 'success'}); }); } }; 

规则1.不要投入回叫。 最好不要抛弃。 只有当你想要进程崩溃时才抛出。 如果您需要将错误传递给调用者使用callback(err) 。 如果你在连接/expression中间件范围,你也可以使用next(err)

规则2.如果还有东西被抛出,你想抓住它,使用域 。 考虑到这样的规则1,你只能捕获超意外的事情,所以你必须尽快把这个过程取下来。

在asynchronouscallback中引发的exception转到callback的调用者,而不是您周围的代码。 所以这是req.coll.remove代码接收exception(这是不处理它),并崩溃你的应用程序。

相反,您需要让您的删除actionfunction接受一个callback参数,它可以用来将错误传回给调用者。

这就是为什么在node.js代码中很less使用exception,callback是标准的原因。

而不是使用callback,使用承诺,并在承诺链内抛出excpetion …

 var P = require('bluebird'); // ... return new P(function(resolve, reject) { req.coll.remove({_id : req.coll.id(req.params.id)}, function(e, result) { if (e) { reject(swe.invalid('collection')); // THIS ERROR will be CAUGHT } resolve(res.send({msg : 'success'})); }); }) .catch(function(err) { throw err; });