2017-07-28 292 views
1

所以,這件小事。我們所知道的表達有內置的默認錯誤處理程序,預計四個參數(ERR,REQ,水庫,下一個)來處理「同步異常」之類的ReferenceError,類型錯誤等:究竟Express.js如何處理錯誤?

UPDATE:這個問題是快遞 - 具體,而不是如何捕捉未處理的異常/等。我想知道如何在第一個代碼塊Express可以處理用戶定義的異常。第二個例子與異步。異常並不直接屬於這個問題。

const express = require('express')(); 

express.all('*', (req, res) => { 
    throw new Error('my own error'); 
    res 
    .send('okay?'); 
}); 

express.use((err, req, res, next) => { 
    console.error(err.stack); 
    res 
    .status(503) 
    .send('Express is still up and running'); 
}).listen(3000); 

但不是這樣的:

const express = require('express')(); 

express.all('*', (req, res) => { 
    process.nextTick(() => { 
    throw new Error('my own error'); 
    }); 
    res 
    .send('okay?'); 
}); 

express.use((err, req, res, next) => { 
    console.error(err.stack); 
    res 
    .status(503) 
    .send('Won\'t be executed'); 
}).listen(3000); 

但我很好奇實現這一處理程序。

我無法找到像

process.on('uncaughtException'...或域/承諾/集羣東西。

也許我想念一些東西。

任何人都可以澄清?

回答

1

有是被執行的catch-all kind of block in Express's router

try { 
    fn(req, res, next); 
} catch (err) { 
    next(err); 
} 

所以在這個塊中的所有異常獲取,並翻譯成next()功能設置爲例外匹配錯誤參數調用。

更詳細地,當一個請求到達時表達:

  • app.handle()被調用,然後確定路由器,並通過層調用router.handle()
  • router.handle()過程和最終匹配您的處理程序與express.all('*', ...)簽名註冊
  • handle_request(在路由器內部的Layer模塊中)按照上面的try-catch塊的規定調用你的處理函數,有效地捕獲所有可能的異常並將它們轉換爲n分機呼叫。
+1

感謝您的詳細解答。我只是做了自己的'快車'來重現這種行爲。非常簡單和優雅的處理,對我來說。 – loadaverage