我無法理解如何處理它看起來像是快遞的一個非常基本的方面。如果我有一些在異步回調中引發異常的代碼,我無法捕獲該異常,因爲在回調運行時try/catch塊不在範圍內。在這些情況下,瀏覽器將掛起,直到它最終放棄說明服務器沒有響應。這是一個非常糟糕的用戶體驗。我寧願能夠立即向客戶返回500錯誤。默認的快速錯誤處理程序顯然不處理這種情況。下面是一些示例代碼:快速處理異常
var express = require("express");
var app = express();
app.use(app.router);
//express error handler (never called)
app.use(function(err, req, res, next) {
console.log(err);
res.send(500);
});
app.get("/test", function(req, res, next) {
require("fs").readFile("/some/file", function(err, data) {
a.b(); //blow up
});
});
app.listen(8888);
在上面的代碼中,線A·B()拋出一個「的ReferenceError:一個沒有定義」異常。定義的錯誤處理程序從不被調用。請注意,在這種情況下,由fs.readFile()返回的err對象爲空,因爲文件已被正確讀取。該錯誤是異步處理程序中的代碼。
我已閱讀this post關於使用節點的uncaughtExpception,但the documentation說不使用該方法。即使我使用它,我又會如何將500響應發送回用戶?快速響應對象不再供我使用。
那麼你如何處理這種情況?
爲什麼會在回調中拋出錯誤?更有可能的是,MongooseObject會在內部拋出一個錯誤,在那裏你可以捕獲它,然後'回調(錯誤)'。現在上面顯示的回調有一個虛假的錯誤對象,你可以發送500響應。 – Plato
如果Mongoose進入不能回調的錯誤......嗯,我不知道你可以創建一個setTimeout包裝器。但我希望所有錯誤都能立即傳遞給回調函數 – Plato
這不是我擔心的Mongoose,我只是用它來調用異步函數。我更擔心自己的代碼做了一些愚蠢的事情,導致拋出異常。我會更新示例代碼以使其更清晰。 – d512