使用Q处理exception的node.js

我一直在使用节点几个月。 对于asynchronous代码中的error handling,我一直遵循我所知道的最佳实践 ,即通过callback错误参数来处理错误,并让大多数exception冒出来并使应用程序崩溃,因为没有真正的一个干净的恢复方式。

我现在正在和一个使用Q的开发人员一起工作,他正在使用Q.nfbind来调用一些基于callback的函数。 但是,这给我头痛的error handling。 例如,假设我有一个可以callback的错误的函数:

function doSomething(x, callback) { dbpool.acquire(function(err, conn) { if (err) return callback(err); conn.query('INSERT INTO some_table (x) VALUES (?)', [x], function(err, result) { dbpool.release(conn); if (err) return callback(err); callback(null, result.insertId); }); } var qDoSomething = Q.nfbind(doSomething); 

随着QI可以然后调用qDoSomething并处理错误确定:

 qDoSomething('abc') .fail(function(err) { ... }); 

现在假设我工作得太晚了一晚,并且在查询之前在我的doSomething()函数中检查了这样的代码:

 var foo; foo.doAnotherThing(); 

在我的前Q世界,这将是不好的。 将抛出exception,这将导致应用程序崩溃,并将永远重新启动。 但是,一旦应用程序重新启动,它将至less有效,直到此代码path再次被击中。 但是,使用Q,这个exception现在被捕获并由失败处理程序处理。 这个处理程序不能修复损坏,因为它对连接池一无所知。 现在,每当这个代码path被击中时,一个连接就会从池中泄漏出来,并最终导致应用程序被堵塞。 这个bug的影响只是从糟糕到糟糕。

我不知道用Q来区分最初抛出的错误和通过callback错误产生的错误。 看起来我被困在处理一切或没有。 任何人都可以提出一个方法来从可怕的坏回来?

如何子类Error包装这些err的?

 var MyError = function() { Error.apply(this, arguments); }; var generateError = function(callback) { callback(new MyError('some reason')); }; var doSomething = q.nfbind(generateError); doSomething() .fail(function(e) { console.log('Was this a MyError instance?', e instanceof MyError); });