14

我正在尝试创建一个记录响应时间和状态代码并将其发送到数据库的中间件。但是,我不确定要使用什么事件。在节点的文档中有一个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()
})

只会header触发,它会返回正确的 res.statusCode。

我的问题:

  1. 为什么不close开火?为什么要header开火?
  2. 这是一个可靠的方法吗?
4

2 回答 2

23

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

app.use(function(req, res,next){
    res.on('finish', function(){
        console.log('the response has been sent');
    });
    next();
});
于 2016-07-25T16:30:34.903 回答
9

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

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

更新

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

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

于 2012-09-02T21:45:34.203 回答