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

因此,Node.js中的callback函数的一般约定是“保留”错误的第一个参数(如果存在的话)。 例如:

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

如果您需要返回多个错误(比如说多个数据validation错误),那么传递一个错误对象数组被认为是错误的forms吗? 例:

 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, ...] } ); } 

3年后

任何在callback中放入数组的东西都会让我发疯。

正确的解决scheme是作为第一个参数返回一个error 。 如果你想返回多个错误,你可能会使用错误的非例外情况。

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

如果你有多个意外的操作错误(不太可能),你可以做这样的MultiError

原文

我认为返回错误数组没有任何问题。

虽然你可以返回一个新的自定义ValidationError ,它有一个属性"messages" ,它是一个数组。

一个)

 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)); } } 

通过search相同的问题find这个问题。 虽然我环顾四周,得出的结论是,我不认为这个err应该是一个错误或null

我发现的最好的“权威”来源是Nodejitsu的帮助主题:

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

在node.js中,通过返回它们作为当前函数callback的第一个参数来处理asynchronous函数中的错误,被认为是标准的做法。 如果出现错误,则第一个参数将传递一个包含所有细节的Error对象。 否则,第一个参数是空的。

但是我认为你可以从直觉的angular度来谈论为什么它应该如此。 尽pipe在代码中有很多if (err)testing来决定是否有错误,但不应该传递0falseundefinedNaN或空string。 你应该可以用if (err == null)来testing,如果你愿意的话。

传递err字段中的非空值,但不匹配if (err instanceof Error)看起来不合适。 所以我build议不要使用数组或对象。 如果你这样做,还要注意,你的数组中没有任何错误将会识别出创build聚合错误的位置。 这就是“真正的错误”发生的地步,因为它是决定的时刻,它所给出的错误不是它能够处理的。

但是,这意味着你需要更多的工作来获得这个:

 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]'; } 

也许有点矫枉过正 但是,如果你真的不能select一个错误来表示聚合,并认为有人可能会对这组错误感兴趣,而不是一个,它似乎(?)这是你想要做的…允许调用者检查errs数组是否需要。