Node.js/Express响应事件

Jon*_*Ong 8 node.js

我正在尝试创建一个记录响应时间和状态代码并将其发送到数据库的中间件.但是,我不确定要使用什么事件.在节点的文档中有一个close事件但它永远不会被触发.end也不起作用.但是,header确实如此,但我找不到任何文档.

app.use(function(req, res, next) {
  res.on('close', function() {
    console.log('close')
  })

  res.on('end', function() {
    console.log('end')
  })

  res.on('header', function() {
    console.log('header')
    console.log(res.statusCode)
  })

  next()
})
Run Code Online (Sandbox Code Playgroud)

只有header触发,它确实返回正确的res.statusCode.

我的问题:

  1. 为什么不close解雇?为什么要header解雇?
  2. 这是一个可靠的方式吗?

Vov*_*kyi 9

有一个完成事件,它在发送响应时发出.

app.use(function(req, res,next){
    res.on('finish', function(){
        console.log('the response has been sent');
    });
    next();
});
Run Code Online (Sandbox Code Playgroud)

  • 注意:这并不意味着客户已经收到任何东西。https://nodejs.org/api/http.html#http_event_finish (2认同)

Vad*_*hev 5

close仅在调用response.end()之前终止连接时发出事件。 header事件由触发connect。这不是node.js http.ServerResponse本机事件。

connect responseTime中间件。我认为它应该对您有帮助。

更新

这是header事件文档https://github.com/senchalabs/connect/blob/gh-pages/tests.md#patch

hederhttps://github.com/senchalabs/connect/blob/master/lib/patch.js代理的writeHead方法触发connect