我想制定出完美方式來處理我的應用程序中的錯誤。 我設計了一種方法(見下文),但我很困惑,因爲我失去了原來的錯誤。運行下一個(新的錯誤())在節點保留原始錯誤
在我的代碼,我有這樣的事情(這是一箇中間件):
exports.tokenApi = function(req, res, next, token){
Workspace = mongoose.model('Workspace');
User = mongoose.model('User');
req.application = {};
// Find the token
Workspace.findOne({ 'access.token': token } , function(err, doc){
if(err){
next(new g.errors.BadError503('Database error resolving workspace Id'));
} else {
if(! doc){
next(new g.errors.ForbiddenError403('Access denied'));
} else {
// The token is there and it's valid.
// Set req.application.workspaceId, req.application.login and
// req.application.workspace (which contains all of the settings!)
req.application.workspaceId = doc._id;
req.application.workspace = doc;
req.application.login = doc.access.filter(function(entry){ return entry.token == token; })[0].login;
next();
}
}
不同的文件定義的錯誤:
// Defining the BadError error type, thrown by the application itself
//
function BadError503(message){
this.httpError = 503;
this.message = message || "Internal error";
this.name = this.constructor.name;
}
util.inherits(BadError503, Error);
exports.errors.BadError503 = BadError503;
// Defining the Error error type, thrown by the application itself
//
function ForbiddenError403(message){
this.httpError = 403;
this.message = message || "User not logged in";
this.name = this.constructor.name;
}
util.inherits(ForbiddenError403, Error);
exports.errors.ForbiddenError403 = ForbiddenError403;
應用程序定義的錯誤處理程序這是這樣的:
exports.AppErrorHandler = function(err, req, res, next){
var user = null;
var workspace = null;
switch(err.name){
case 'BadError503':
case 'ForbiddenError403':
Logger(null, null, 4, 'The application threw an error: ' + err.name + ', message: ' + err.message, req );
res.json({ message: err.message }, err.httpError);
break;
這段代碼的麻煩是我失去了原來的錯誤。我有一個自定義的錯誤處理程序,可以說「做正確的事情」(參見上面的代碼:通過Ajax返回錯誤),但是如果我以某種方式保留了實際問題的原因,我希望它。
這給我帶來了一個不同的問題:這是不好的做法?在某種程度上,我喜歡這樣一個事實,即我拋出自己的錯誤,並且可以100%處理它(我自己組成了Error對象)。但是,失去原來的錯誤對我來說似乎是個壞主意。
我可能可能會傳遞原始錯誤到我創建的自定義錯誤的對象。但仍...
有什麼想法?或者,我應該知道的任何標準模式?
您可以將其他參數添加到您返回的錯誤中,類似於[域的方式](http://nodejs.org/docs/latest/api/domain.html#domain_additions_to_error_objects);例如'err.name ='BadError503';下一個(ERR);'。 –
好點。所以我會有效地擺脫我創建的自定義錯誤對象(我不喜歡它們),只是在'err'中添加額外信息後'下一個(err)'?我非常喜歡這個計劃。似乎是比我設計的更好的方式去? – Merc