2013-03-28 37 views
18

我試圖得到錯誤處理運行與快遞,而不是看到「錯誤!!!」的迴應。就像我期望的那樣,我在控制檯上看到「一些異常」,然後這個過程就被終止了。這是錯誤處理應該如何設置,如果有的話是否有另一種方法來捕捉錯誤?表達式js錯誤處理

var express = require('express'); 
var app = express(); 

app.use(function(err, req, res, next) { 
    console.log("error!!!"); 
    res.send("error!!!"); 
}); 

app.get('/', function(request, response) { 
    throw "some exception"; 
    response.send('Hello World!'); 
}); 

app.listen(5000, function() { 
    console.log("Listening on 5000"); 
}); 

回答

23

一個示例應用程序/指南錯誤處理可在 https://expressjs.com/en/guide/error-handling.html 但是應該解決您的代碼:

// Require Dependencies 
var express = require('express'); 
var app = express(); 

// Middleware 
app.use(app.router); // you need this line so the .get etc. routes are run and if an error within, then the error is parsed to the next middleware (your error reporter) 
app.use(function(err, req, res, next) { 
    if(!err) return next(); // you also need this line 
    console.log("error!!!"); 
    res.send("error!!!"); 
}); 

// Routes 
app.get('/', function(request, response) { 
    throw "some exception"; 
    response.send('Hello World!'); 
}); 

// Listen 
app.listen(5000, function() { 
    console.log("Listening on 5000"); 
}); 
+8

對於未來的人來說,3.x => 4.x遷移過程不推薦使用app.router;請參閱https://github.com/strongloop/express/wiki/Migrating-from-3.x-to-4.x。 –

7

一些提示:

1)您的代碼不工作因爲您的錯誤處理程序中間件在您的路由到達之前運行,所以錯誤處理程序從未有機會將錯誤傳遞給它。這種風格被稱爲延續傳球。將錯誤處理程序放在中間件堆棧中。

2)當你有一個未處理的錯誤時,你應該關閉服務器。要做到這一點,最好的辦法是打電話server.close(),其中服務器是做var server = http.createServer(app);

這意味着的結果,你應該做這樣的事情:

var server = http.createServer(app); 

app.use(function(err, req, res, next) { 
    console.log("error!!!"); 
    res.send("error!!!"); 
    server.close(); 
}); 

你應該也超時了server.close (),如果它不能完成(您的應用程序處於不確定的狀態,畢竟):

var server = http.createServer(app); 

app.use(function(err, req, res, next) { 
    console.log("error!!!"); 
    res.send("error!!!"); 

    server.close(); 

    setTimeout(function() { 
    process.exit(1); 
    }, 3*1000); 
}); 

我所做的這一切爲你一個庫,並允許您定義自定義的響應,包括專門錯誤視圖,要提供的靜態文件等...:

https://github.com/ericelliott/express-error-handler

+1

「你應該關閉服務器」?爲什麼?沒有!你不應該! – fiatjaf

+0

如果您有未處理的錯誤,您絕對應該關閉服務器,因爲錯誤可能會使應用程序處於未定義狀態 - 這意味着事情可能會出錯。關機使應用程序有機會通過重新進入穩定狀態進行自我修復。 –

+0

所以如果有人觸發了一個未處理的異常,整個應用程序將爲每個人都失望?這是愚蠢的 – astroanu

2

我有同樣的問題,無法弄清楚什麼是錯的。 事情是,如果你有明確的errorHandler定義,那麼你的自定義錯誤處理程序永遠不會被調用。 如果你有一個代碼,只需將其刪除:

if ('development' == app.get('env')) { 
    app.use(express.errorHandler()); 
} 

爲我工作:)

+0

我會建議使用3'='所以它只輸入檢查只是爲了好habbit :) –

1

安裝快速安裝連接域,則是這樣的:

var express = require("express"), 
    connectDomain = require("connect-domain"), 
    app = express(), 
    errorHandler; 

//我們錯誤處理程序

app.use(connectDomain()); 
    errorHandler = function (err, req, res, next) { 
     res.send(500, { 
      "status": "error", 
      "message": err.message 
     }); 
    console.log(err); 
}; 

然後,當設置您的端點時,粘性errorHan ():

app.get("/some/data", function (req, res) { 
    // ... do some stuff ... 
    res.send(200, "Yay! Happy Success!"); 
}).use(errorHandler);