2011-12-15 39 views
11

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

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

回答

9

在3年后

任何人都认为把一个阵列中的回调会让我发疯。

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

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

如果您有多个意想不到的操作错误(不太可能),你可以做这样的事情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)); 
    } 
} 
+0

+1注意错误应该实际上是一个`错误` – laconbass 2013-10-09 09:44:57

+1

我对你下了*“我认为没有错误返回错误数组”*,但奖励你100点奖励*(作为当我得到更多的关注时,没有人回答,所以我没有其他人给出答案)*。也许98点的净收益将是一个重新审视和重新思考问题的小动机:-P ...因为我认为经典是在Node中一系列错误不是有效的错误参数。 – HostileFork 2014-07-29 06:44:52

4

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

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

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

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

但我认为,你可以从直觉上作出一个论点,为什么它应该如此。尽管在代码中有很多if (err)测试来决定是否有错,但不应该通过0falseundefinedNaN或一个空字符串。如果您愿意,您应该可以使用if (err == null)进行测试。

传递回err字段中非空,但不匹配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]'; 
} 

有点大材小用,也许。但是,如果你真的不能选择一个错误来表示聚集,并且认为有人可能对这组错误感兴趣而不是仅仅一个,那么看起来(?)这就是你想要做的事情......允许如果需要,调用者检查errs阵列。