【发布时间】:2012-06-21 11:59:00
【问题描述】:
我想编写一个快速中间件函数,它在响应的“结束”事件(如果存在)上设置一个侦听器。目的是根据最终处理程序决定发送的 http 响应代码进行清理,例如记录数据库事务的响应代码和回滚/提交。即,我希望此清理对最终调用者透明。
我想在 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);
}
});
}
当我尝试这个时,'end' 事件处理程序永远不会被调用。 res.on('close') 也是如此,我在另一篇文章中读到过。此类事件会被触发吗?
我能想到的唯一其他方法是在自定义中间件中用我自己的版本包装 res.end 或 res.send。这并不理想,因为res.end 和res.send 不接受回调,所以我不能只包装它们,调用原始代码,然后根据他们给我回电时设置的响应代码做我的事情(因为他们不会给我回电话)。
有没有简单的方法来做到这一点?
【问题讨论】:
-
你为什么不在
res.end之前做家务? -
这也很好,但我想把它作为中间件来做,也就是说,最终处理程序不必担心清理。因此,如果我想记录生成的响应代码,或者根据响应代码回滚/提交数据库事务,我希望它对最终处理程序透明地操作。所以我试图在调用 res.send 的结束处理程序和正在完成的请求之间的某个时刻捕获执行。
-
但是你正在定义状态码:/
-
我是?我正在编写一个路由中间件函数。结束处理程序定义返回码。我想做一些事情来回应他们决定发送的内容。
标签: events node.js express response