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

Mai*_*uiz 7 javascript logging node.js express

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

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

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

res.json({ foo: 'bar' })
Run Code Online (Sandbox Code Playgroud)

我需要一种方法来获取该{ 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);
    });
    ...
}
Run Code Online (Sandbox Code Playgroud)

res我可以使用Express对象中的任何属性或方法吗?或者,是否有更好的策略来记录请求及其响应?

mur*_*zel 8

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

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

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

response.on('finish', () => {
  // Do your logging here.
});
Run Code Online (Sandbox Code Playgroud)

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


Jak*_*kul 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);
Run Code Online (Sandbox Code Playgroud)

如果您想使用开箱即用的解决方案或正在寻找一些有关如何自己实现它的参考点,那么这个答案可能会很有用。