2012-09-10 23 views
4

我是新來的node.js和express。我在app.js文件作爲最後的手段錯誤處理程序如下:Node.js w/express回調中的錯誤處理

app.use(function(err, req, res, next){ 
    // we may use properties of the error object 
    // here and next(err) appropriately, or if 
    // we possibly recovered from the error, simply next(). 
    res.status(err.status || 500); 

    console.log(err); 

    var errMsg = "An internal error occurred. Please notify your system administrator."; 

    // respond with json 
    if (req.accepts('json')) { 
    res.send({error: errMsg}); 
    return; 
    } 

    // respond with html page 
    if (req.accepts('html')) { 
    res.render('500', errMsg); 
    return; 
    } 

    res.type('txt').send(errMsg); 
}); 

它在測試過程中對我的作品時,我殺了數據庫服務器或者以其他手段誘使「中間件」級別的錯誤,但我不確定當回調接收到錯誤時它是否也會啓動?我一直在使用這樣的事情我的回調中:

if(err) { 
    console.log(err); 
    res.send(500, {error: err}); 
} 

但我想更好地堅持DRY原則,並想出一個辦法來處理全球範圍內的回調錯誤(跨模塊),而不是寫的一堆相同的代碼。如果中間件'catchall'不起作用,我堅持每個模塊的全局函數嗎?希望這是有道理的。

+0

的確似乎錯誤的中間件不趕回調中的錯誤... – esp

回答

1

看看connect-domain中間件。它可以幫助您捕獲異步回調,超時等內部的所有錯誤。僅適用於節點> 0.8.0。

+1

域功能似乎是Node中這種事情發生的方式,但我不確定它是否已準備好用於生產。檢查這個涉及連接/快速創建者的討論: https://github.com/visionmedia/express/issues/1291 – Troy

1

現在我結束了剛剛創建一個全局錯誤處理程序模塊:

exports.globalErrorHandler = function(err, req, res) { 
    if(!err || !req || !res) return; 

    console.log(err); 

    var errMsg = "An internal error occurred. Please notify your system administrator."; 

    // respond with json 
    if (req.accepts('json')) { 
    res.send({error: errMsg}); 
    return; 
    } 

    // respond with html page 
    if (req.accepts('html')) { 
    res.render('500', errMsg); 
    return; 
    } 

    res.type('txt').send(errMsg); 
} 

,並要求其在需要它的模塊:

var gh = require('../helpers/globalErrorHandler.js'); 

// Inside a callback 
if(err) { 
    gh.globalErrorHandler(err, req, res); 
    return; 
} 
+0

你還在使用app.use嗎? – UpTheCreek