2011-12-15 52 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陣列。