检查节点中的错误参数

在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指出的那样,如果模块约定从nullundefined0甚至NaN ,你仍然是安全的。 我从来没有被这个只有if(err)

另一方面,你可能想使用coffescript,这将为你翻译

 unless err? then... 

 if (typeof err === "undefined" || err === null) { 

模仿最常见的模式。

一些链接来证实if(err)方法:

惯例似乎是传递一个错误对象作为第一个参数和null没有错误,所以即使你传递一个空的对象,它仍然是一个错误。

如果使用stream行的express框架,则应该使用nextcallback从中间件返回,该中间件遵循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)。