在快速中间件中记录请求和响应

时间:2016-06-01 21:20:37

标签: javascript node.js express logging

我正在尝试在Express应用程序中实现记录器。我需要它能够记录请求以及为每个请求发回的响应(状态代码和正文)。我开始编写一个看起来像这样的中间件:

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对象中是否有可用于此的属性或方法?或者,是否有更好的策略来记录请求及其响应?

2 个答案:

答案 0 :(得分:2)

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

a finish event in node.js http server instances使您能够在将回复发送给客户后执行操作。

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

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

我建议在请求期间将日志保存在javascript对象中,并在发送响应时将其发送到完成事件的回调中。

答案 1 :(得分:2)

我找到了一个现有的模块morgan-body,该模块可以完成您要尝试执行的操作。

根据文档,这是您使用中间件的方式:

const morganBody = require('morgan-body');
const bodyParser = require('body-parser');
const express = require("express");

const app = express();

// must parse body before morganBody as body will be logged
app.use(bodyParser.json());

// hook morganBody to express app (Unlike typical express middleware you're passing the actual app into the function)
morganBody(app);

如果您想使用开箱即用的解决方案,或者正在寻找有关如何自己实现的参考点,则此答案可能会有用。