Tôi muốn viết một hàm trung gian thể hiện để thiết lập một người nghe trên sự kiện 'kết thúc' của phản hồi, nếu sự kiện tồn tại. Mục đích là để làm sạch dựa trên mã phản hồi http mà trình xử lý kết thúc đã quyết định gửi, ví dụ: ghi lại mã phản hồi và rollback/commit của một giao dịch db. tức là, tôi muốn dọn dẹp này được minh bạch cho người gọi cuối.Làm cách nào để nắm bắt sự kiện "kết thúc phản hồi" trong node.js + express?
Tôi muốn làm điều gì đó như sau trong nhanh:
Tuyến middleware
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();
}
Tuyến:
app.post ("/something", function (req, res) {
db.doSomething (function() {
if (some problem) {
res.send (500);
} else {
res.send (200);
}
});
}
Khi tôi cố gắng này, 'kết thúc' xử lý sự kiện không bao giờ được gọi. Tương tự cho res.on('close')
, mà tôi đọc trong một bài đăng khác. Các sự kiện như vậy có bị sa thải không?
Cách duy nhất khác mà tôi có thể nghĩ là thực hiện việc này là gói res.end
hoặc res.send
bằng phiên bản của riêng mình trong phần mềm trung gian tùy chỉnh. Đây không phải là lý tưởng, bởi vì res.end
và res.send
không gọi lại, vì vậy tôi không thể chỉ quấn chúng, gọi ban đầu và sau đó làm điều của tôi dựa trên mã phản hồi đã được đặt khi họ gọi lại cho tôi (vì họ đã thắng ' t gọi lại cho tôi).
Có cách nào đơn giản để thực hiện việc này không?
Tại sao bạn không làm những thứ vệ sinh trước khi 'res.end'? –
Cũng tốt, nhưng tôi muốn làm điều đó như là phần mềm trung gian, tức là không có người xử lý cuối cùng phải lo lắng về việc dọn dẹp. Vì vậy, nếu tôi muốn đăng nhập mã phản hồi kết quả, hoặc rollback/cam kết giao dịch db dựa trên mã phản hồi, tôi muốn điều đó hoạt động một cách trong suốt tới trình xử lý cuối. Vì vậy, tôi đang cố gắng bẫy thực hiện tại một số điểm giữa xử lý kết thúc gọi res.send và yêu cầu được thực hiện. – Jake
Nhưng ** bạn ** đang xác định mã trạng thái:/ –