【问题标题】:Logging requests and responses in express middleware在快速中间件中记录请求和响应
【发布时间】:2016-06-01 21:20:37
【问题描述】:

我正在尝试在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 对象中是否有任何属性或方法可供我使用?或者,是否有更好的策略来记录请求及其响应?

【问题讨论】:

标签: javascript node.js express logging


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 我尝试将此添加为中间件来记录请求,但请求被卡住了。
【解决方案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);

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

【讨论】:

  • 这太丑了。它可以工作。但仍然是非模式
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
  • 1970-01-01
  • 1970-01-01
  • 2019-08-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
相关资源
最近更新 更多