https://expressjs.com/en/guide/error-handling.html 上的 expressjs 官方檔案宣告如下:
請注意,當不在錯誤處理函式中呼叫“next”時,您負責撰寫(和結束)回應。否則,這些請求將“掛起”并且沒有資格進行垃圾回收。
他們最后一個自定義處理程式的示例如下:
...
app.use(logErrors)
app.use(clientErrorHandler)
app.use(errorHandler)
function errorHandler (err, req, res, next) {
res.status(500)
res.render('error', { error: err })
}
在這一點上,我不確定這個例子是否真的結束了回應。當最后一個自定義錯誤處理程式呼叫 .status() 和 .render()時它是否已經結束?
該檔案進一步說明
res.end([data] [, encoding]) 結束回應程序。這個方法其實來自Node核心,具體是http.ServerResponse的response.end()方法。用于在沒有任何資料的情況下快速結束回應。如果您需要使用資料進行回應,請改用 res.send() 和 res.json() 等方法。
這對我來說意味著,例如 send() 將結束回應。在基于 express 的 restify 中,檔案指出
與其他 REST 框架不同,呼叫 res.send() 不會自動觸發 next()。在許多應用程式中,作業可以在 res.send() 之后繼續發生,因此重繪 回應并不是請求完成的同義詞。
這就是為什么不確定,是否只是呼叫 send(),json() 或 status 真的足以將這些資源釋放到垃圾收集
我原以為我們必須
- 不帶引數呼叫 next() (這樣默認處理程式最終會結束它)或
- res.end() 手動結束
在我們給客戶寫了回復之后
- res.status() 或
- res.status(...).res.send(...) 或
- res.send(...) 或
在自定義錯誤處理程式中結束回應的正確方法是什么?
uj5u.com熱心網友回復:
res.send內部呼叫res.end,但res.status只設定 HTTP 狀態,不呼叫res.end. 與res.render,這取決于回呼函式。默認回呼叫于res.send輸出渲染(暗示res.end),或next(err)在渲染錯誤的情況下。
因此res.send,res.end和res.render(使用默認回呼)將結束回應。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/333153.html
標籤:表达
