我想編寫一個快速中間件函數,該函數在響應的「結束」事件(如果存在)上設置偵聽器。目的是基於最終處理程序決定發送的http響應代碼進行清理,例如,記錄響應代碼和db事務的回滾/提交。即,我希望這個清理對最終調用者是透明的。如何在node.js + express中捕獲「響應結束」事件?
我想這樣做的明確以下幾點:
路線中間件
function (req, res, next) {
res.on ('end', function() {
// log the response code and handle db
if (res.statusCode < 400) { db.commit() } else { db.rollback() }
});
next();
}
路線:
app.post ("/something", function (req, res) {
db.doSomething (function() {
if (some problem) {
res.send (500);
} else {
res.send (200);
}
});
}
當我嘗試這一點, '結束'事件處理程序從不被調用。 res.on('close')
也是如此,我在另一篇文章中讀到過。這樣的事件是否被解僱?
我能想到的唯一另外一種方式是將res.end
或res.send
與我自己的版本一起包裝在自定義中間件中。這並不理想,因爲res.end
和res.send
不接受回調,所以我不能將它們包裝起來,調用原件,然後根據響應代碼來做我的事情,這些代碼在他們回電時已經設置(因爲他們贏得了'不要打電話給我)。
有沒有簡單的方法來做到這一點?
你爲什麼不前'res.end'做家政的東西? –
這也沒關係,但我想把它當作中間件,即沒有最終處理程序不必擔心清理。所以如果我想記錄結果響應代碼,或者基於響應代碼回滾/提交db事務,我希望它能夠透明地操作結束處理程序。所以我試圖在調用res.send的最終處理程序和正在完成的請求之間的某個時刻捕獲執行。 – Jake
但**你**正在定義狀態碼:/ –