Events 我如何捕获一个;回应结束“;事件在node.js+;快车?

Events 我如何捕获一个;回应结束“;事件在node.js+;快车?,events,node.js,express,response,Events,Node.js,Express,Response,我想编写一个express中间件函数,在响应的“end”事件上设置一个侦听器(如果存在的话)。其目的是基于终端处理程序决定发送的http响应代码进行清理,例如记录响应代码和db事务的回滚/提交。i、 例如,我希望这个清理对最终调用方是透明的 我想在express中执行以下操作: 路由中间件 function (req, res, next) { res.on ('end', function () { // log the response code and handle db

我想编写一个express中间件函数,在响应的“end”事件上设置一个侦听器(如果存在的话)。其目的是基于终端处理程序决定发送的http响应代码进行清理,例如记录响应代码和db事务的回滚/提交。i、 例如,我希望这个清理对最终调用方是透明的

我想在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();
}
当我尝试此操作时,“end”事件处理程序从未被调用。我在另一篇文章中读到的
res.on('close')
也是如此。这样的事件会被解雇吗

我能想到的唯一其他方法是在自定义中间件中使用我自己的版本包装
res.end
res.send
。这并不理想,因为
res.end
res.send
不接受回调,所以我不能只包装它们,调用原始代码,然后根据它们回我电话时设置的响应代码执行我的操作(因为它们不会回我电话)

有没有一种简单的方法可以做到这一点?

阅读,这是
res.send
的签名:

res.send(body|status[, headers|status[, status]])
这意味着您可以设置自己的状态,如下所示:
res.send('some string',200)甚至只是
res.send(404)

此方法是用于发送响应的方法

一旦它被发送到客户端,您就无法再访问它,因此没有回调

这是服务器最不愿意做的事情。一旦处理完请求,它就会发送响应。

但是,您可以在将其发送到客户端之前访问它。这意味着您可以:

console.log( res );
res.send( datas );

如果要回滚/提交,可以在调用数据库回调时执行,而不是在响应消失时执行。

奇怪的是,响应关闭时,响应似乎会发出“完成”事件:

尽管这个博客条目有点旧,但这个事件仍然存在(),所以我认为它不会很快消失,即使node和express的文档都没有提到它。 到2014年初,它已经转移到并仍然有效


顺便说一句,服务器响应上的“错误”事件可能不是您通常希望看到的。为了进一步说明@Amatsuyu的响应,下面是它的外观:

res.on('finish', function() {
  // do stuff here
});

为什么不在
res.end
之前做内务处理呢?那也不错,但我想作为中间件来做,也就是说,终端处理程序不必担心清理。因此,如果我想记录生成的响应代码,或者基于响应代码回滚/提交db事务,我希望它对最终处理程序透明地运行。因此,我试图在调用res.send的终端处理程序和正在完成的请求之间的某个点捕获执行。但是您正在定义状态代码:/I am?我正在编写一个路由中间件函数。结束处理程序定义返回代码。我想做一些事情来回应他们决定发送的内容。我更新了解释以澄清我正在尝试做的事情。谢谢。从您的回答来看,如果不将res.send替换为我自己的版本来进行清理,然后调用真正的res.send.Yes,
res.send()
是您的应用程序在处理请求时最不可能执行的操作,因此如果您想进行任何清理,您必须在之前执行:)res.on('header',func)FTW!因答案不正确而被否决。请参阅下面的答案,了解如何在发送响应时使用res.on('finish',…)附加要触发的事件处理程序。+1我找不到文档,但当前的源代码(截至今天)仍然引发事件。谢谢!无法使用finish、end或close使其生效。有任何建议吗?res.on('header',func)FTW!这是记录在案的“finish”事件吗?:Express.js response扩展了内置的http响应,而finish事件不是特定于Express的,因此它不在Express docsIs中。有任何方法可以访问回调中的res的最终状态吗?例如,回调可以查看res并提取发送给客户端的数据吗?是的@因为这个事件监听器是在app.use调用中处理的,所以从那里使用相同的“res”对象即可。
res.on('finish', function() {
  // do stuff here
});