2014-12-03 26 views
5

我建立了一個API(使用Expressjs V4),而且通常我已經經歷了路線中的錯誤,而不是使用中間件。例如:Expressjs - 錯誤處理中間件

router.use('/', function(req, res, next) { 
    ... 
    if (err) 
    return res.status(500).send({type: "serverError", message: "Something has gone wrong on our end."}); 
} 

我現在認識到中間件是「走的路」。我在這裏看到了Expressjs站點上相當有限的文檔:http://expressjs.com/guide/error-handling.html但仍不確定一些事情。

我已經添加在server.js

function errorHandler(err, req, res, next) { 

} 

但我應該如何處理不同類型的錯誤(400404500等)?

我發現自己寫的每個發生錯誤時3行代碼:

//A route 
var err = new Error(); 
err.status = 404; 
return next(err); 

,我可以使用訪問狀態:

function errorHandler(err, req, res, next) { 
    console.log(err.status); 
    if(err.status == "400") 
    //do something 
    else 
    //etc etc 
} 

肯定有比這更簡單的方法?我錯過了什麼嗎?

回答

2

你應該創建自己的錯誤類型,允許你提供一切必要的行動上的錯誤信息。

var util = require('util'); 

function HttpError(message, statusCode){ 
    this.message = message; 
    this.statusCode = statusCode; 
    this.stack = (new Error()).stack; 
} 

util.inherits(Error, HttpError); 
module.exports = HttpError; 

然後包括你的新的錯誤對象在你的代碼,並使用它像

next(new HttpError('Not Found', 404)); 

或者你可以去瘋狂和實施每一個響應碼事前填充statusCode部分錯誤類型。

編號:What's a good way to extend Error in JavaScript?

+0

可以忽略'this.stack'一部分,如果你不需要的堆棧跟蹤,但它的超有用有時 – tkone 2014-12-03 14:31:37

2

而是手動創建錯誤,您可以委派錯誤,如下面。

return next(err); 

而你的錯誤將深入到所有定義的路由,直到它找到具有低於簽名的路由。

app.use(function (err, req, res, next) { 

}); 

你可以看到上面路線ERR說法。

理想情況下,你可以使用以下兩種方法用於開發&生產環境。

if (process.env.NODE_ENV === 'development') { 
    app.use(function (err, req, res, next) { 
     res.status(err.status || 500); 
     logger.log('info', err.message + " expected URL was " + req.url); 
     res.status(err.status).send(err.status, { 
      message: err.message, 
      error : err 
     }); 
    }); 
} 

app.use(function (err, req, res, next) { 
    res.status(err.status || 500); 
    logger.log('error', err.message + " expected URL was " + req.url); 
    res.status(err.status).send(err.status, { 
     message: err.message, 
     error : {} 
    }); 

}); 

您可以在那裏拍攝實際人口錯誤對象。

+1

但'err'不會有'status'儘管將它,除非我手動設置爲在我的問題正確嗎? - 以及我試圖避免的那三條線,因爲我必須爲每個錯誤都做到這一點。 – tommyd456 2014-12-03 17:58:28

+0

並非每個錯誤都帶有狀態。但是你正在使用[回調](https://www.joyent.com/developers/node/design/errors),或者你不是! – 2014-12-03 18:05:25

+0

是的,我正在使用回調 – tommyd456 2014-12-03 18:11:47