检查节点中的错误参数
在asynchronous操作中传递一个错误参数是节点中的约定:
async.someMagicalDust(function(callback) { // some asynchronous task // […] callback(); }, function(err) { // final callback if(err) throw err; // […] });
也许我太天真了,但是我从来没有对if(variable)
符号的大爱好者 – 可能从Cinheritance,因为过去已经讨论过很多次了 。
另一方面,我有时遇到一个null
参数,这个错误检查:
if(typeof err !== 'undefined' && err !== null)
有点太冗长了。
另一个解决scheme是
if(err != null)
但我认为非严格的检查可能会非常棘手,即使我认为与空比较是正常的。
检查节点中错误参数的最佳方法是什么?
使用if(err)
。
它被devise成以这种方式使用。 只有在出现实际错误的情况下,节点式callback才会将错误设置为非伪造值。 你不会find任何将err
设置为''
0
''
或“ 0
表示错误的理智例子。
就像YlinaGreed指出的那样,如果模块约定从null
到undefined
到0
甚至NaN
,你仍然是安全的。 我从来没有被这个只有if(err)
。
另一方面,你可能想使用coffescript,这将为你翻译
unless err? then...
成
if (typeof err === "undefined" || err === null) {
模仿最常见的模式。
一些链接来证实if(err)
方法:
- https://gist.github.com/klovadis/2548942
- http://caolanmcmahon.com/posts/nodejs_style_and_structure/ (由
async
作者Caolan McMahon撰写) - http://thenodeway.io/posts/understanding-error-first-callbacks/
惯例似乎是传递一个错误对象作为第一个参数和null
没有错误,所以即使你传递一个空的对象,它仍然是一个错误。
如果使用stream行的express
框架,则应该使用next
callback从中间件返回,该中间件遵循errback约定。
我相信大多数人喜欢更简洁的next()
比next(null)
,这意味着第一个参数将被评估为undefined
而不是null
,这当然是非常正常的用法。
对我来说,处理错误的最好方法是“if(err == null)”这是我使用非严格运算符的唯一情况,因为这些原因:
- 总是有效的唯一的解决scheme非常冗长,就像你之前说过的那样
- 你也可以只检查“空”或“未定义”,但我做了一次,几个月后,我只是更新我的依赖和…公约更改,模块发送null而不是undefined。
这主要是一个“惯例”的问题,我有我的,而且你也有你的…只要小心select两个“好”的方法之一。
节点的主要callback约定是通过一个函数作为第一个参数err
。 根据我的经验,检查错误是否真的一直是安全的 – 在实践中,如果在错误出现时出现错误,那么问题就更多地体现在执行上。 我总是期望如果err
是空的,没有发生错误。 这可能是由于错误和成功使用单独的函数,这是更多的风格的JQuery.Ajax和承诺混淆。 我倾向于发现双callback有点太罗嗦不能打电话。
鉴于你的例子,似乎你使用的是非常好的asynchronous库。 如果我正在寻找执行并行选项,这是我如何设置它:
function doAThing(callback) { var err; // do stuff here, maybe fill the err var callback(err); } function doAsyncThings(callback) { var tasks = [function(done) { // stuff to do in async doAThing(function(err) { done(err); }); }]; async.parallel(tasks, function(err) { // single callback function callback(err); // I send the error back up }); }
请注意,而不是抛出错误,我冒泡备份请求链。 由于基本上是说“崩溃整个应用程序”,所以我想要抛出一个错误。
我发现它比较简单,并减less了用来调用函数的参数数量。 当你在整个程序中使用这个约定时,你可以通过简单地将callback作为parameter passing,而不是像下面这样创build一个新的匿名函数:
function doAThing(callback) { var err; // do stuff here, maybe fill the err var callback(err); } function doAsyncThings(callback) { var tasks = [function(done) { // stuff to do in async doAThing(done); }]; async.parallel(tasks, callback); // the error is sent back to the original function }
我发现通常你想要处理函数调用这些错误。所以在这种情况下, doAsyncThings
的调用者可以检查是否有错误,并处理它适合自己的范围(也许提供更好的信息给用户如果是说一个API)。