Node.js约定通过回调返回多个错误?

时间:2011-12-15 00:36:20

标签: javascript node.js error-handling

因此,Node.js中回调函数的general convention是“保留”错误的第一个参数(如果存在)。例如:

callSomeBlockingFcn( function callbackWhenDone(err, result) {
  if( err ) ...
});

如果您需要返回多个错误 - 例如多个数据验证错误 - 是否认为传递错误对象数组的形式不佳?例如:

var callSomeBlockingFcn = function(callback) {
  // multiple errors to report back...
  callback( [ err1, err2, ...] );
}

或者最好避免使用数组并使用引用数组的属性返回单个对象(如果需要)?例如:

var callSomeBlockingFcn = function(callback) {
  // multiple errors to report back...
  callback( { errors: [ err1, err2, ...] } );
}

2 个答案:

答案 0 :(得分:9)

3年后

任何将数组放入回调的人都会让我发疯。

正确的解决方案是返回error作为第一个参数。如果要返回多个错误,则可能在非例外情​​况下使用错误。

在这种情况下,它应该进入回调的“值”槽,即第二个参数。第一个参数是针对单个意外的操作错误。

如果您有多个意外的操作错误(不太可能),您可以执行类似MultiError

的操作

<强>原始

我认为返回一系列错误并没有错。

虽然您可以返回一个新的自定义ValidationError,其自定义属性为"messages"

A)

function validateX(x, cb) {
  ...
  if (errorMessages) {
    return cb(errorMessages);
  }
}

b)中

function ValidationError(msgs) {
  this.messages = msgs;
}

function validateX(x, cb) {
  ...
  if (errorMessages) {
    return cb(new ValidationError(errorMessages));
  }
}

答案 1 :(得分:4)

通过搜索同一问题找到此问题。虽然我环顾四周并得出结论,我认为err不应该是错误或null

最好的&#34;权威&#34;我找到的来源是Nodejitsu的帮助主题:

http://docs.nodejitsu.com/articles/errors/what-are-the-error-conventions

  

在node.js中,通过将它们作为当前函数回调的第一个参数返回来处理异步函数中的错误被认为是标准做法。如果有错误,则会向第一个参数传递一个包含所有详细信息的Error对象。否则,第一个参数为null。

但我认为你可以从直觉中解释为什么它应该如此。虽然代码中有很多if (err)测试用于确定某些内容是否有错误,但您不应该通过0false或{{1 }或undefined或空字符串。如果您愿意,您应该可以使用NaN进行测试。

在错误字段中传回非空但但与if (err == null)不匹配的内容似乎很狡猾。所以我建议不要使用数组或对象。如果您这样做,请注意,阵列中的所有错误都不会识别创建聚合错误的位置。这就是&#34;真实错误&#34;发生了,因为这是决定它所给出的错误不是它可以处理的事情的时刻。

然而,这意味着你需要做更多工作才能做到这一点:

if (err instanceof Error)
或许有点矫枉过正了。但是如果你真的不能选择一个错误来代表聚合,并且认为有人可能对这组错误感兴趣而不仅仅是一个错误,那么看起来(?)那就是你的错想做...允许调用者检查function MultipleError (errs) { // http://stackoverflow.com/a/13294728/211160 if (!(this instanceof MultipleError)) { return new MultipleError(errs); } Error.call(this); this.errs = errs; // captureStackTrace is V8-only (so Node, Chrome) // https://code.google.com/p/v8/wiki/JavaScriptStackTraceApi Error.captureStackTrace(this, MultipleError); }; MultipleError.prototype.__proto__ = Error.prototype; MultipleError.prototype.name = 'MultipleError'; MultipleError.prototype.toString = function () { return 'MultipleError: [\n\t' + this.errs.join(',\n\t') + '\n]'; } 数组是否需要。