在高速中间件中logging请求和响应

我试图在快速应用程序中实现一个logging器。 我需要它能够logging请求,并为每个请求发回响应(状态码和正文)。 我开始写一个看起来像这样的中间件:

function (req, res, next) { ... res.on('finish', function () { Logger.debug('For request', req); Logger.debug('Response sent'); }); ... } 

我需要访问传递给用于发送响应的res对象方法的数据。 例如,如果在一个控制器中我有:

 res.json({ foo: 'bar' }) 

我需要一个方法来获得{ foo: 'bar' }对象,可能是这样的:

 function (req, res, next) { ... res.on('finish', function () { Logger.debug('For request', req); var data = res.data; // or res.body, or whatever Logger.debug('Response: ' + res.statusCode, data); }); ... } 

Express res对象中是否有任何属性或方法可供我使用? 或者,是否有更好的logging请求和响应的策略?

您需要一个事件侦听器,当调用response.end(或send)方法时将触发该事件侦听器。 Express没有这样的监听器,但是node.js raw api确实有。

在node.js http服务器实例中有一个finish事件,它使您能够在将响应发送到客户端之后执行某些操作。

您可以轻松地与现有的Express服务器集成:

 response.on('finish', () => { // Do your logging here. }); 

我build议在请求期间将日志保存在JavaScript对象中,并在发送响应时将它们发送到完成事件的callback中。