在Express中间件中记录请求和响应

9

我正在尝试在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对象中可以用来记录请求和响应的属性或方法?或者,是否有更好的策略来记录请求和相应的日志?

1
有各种模块可供使用,以获取响应正文,例如express-interceptor - robertklep
2个回答

8
你需要一个事件监听器,当 response.end(或 send)方法被调用时将被触发。Express 没有这样的监听器,但 node.js 原始 API 有。
在 node.js http 服务器实例中有一个 finish 事件, 它使您能够在向客户端发送响应后执行操作。
您可以轻松地与现有的 Express 服务器集成:
response.on('finish', () => {
  // Do your logging here.
});

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

我尝试将其作为中间件添加来记录请求,但请求被卡住了。 - lazzy_ms

5
我找到了一个现有的模块,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);

如果您想使用现成的解决方案或者需要一些实现方法的参考,那么这个答案可能会对您有所帮助。


这只是丑陋的。它可能能够工作。但仍然不是一个模式。 - Natan Lotério

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接