标题应该是相当self 解释的.

出于调试目的,我希望express打印每个服务请求的响应代码和正文.打印响应代码很容易,但打印响应体更为棘手,因为响应体似乎不容易作为属性使用.

以下情况不起作用:

var express = require('express');
var app = express();

// define custom logging format
express.logger.format('detailed', function (token, req, res) {                                    
    return req.method + ': ' + req.path + ' -> ' + res.statusCode + ': ' + res.body + '\n';
});  

// register logging middleware and use custom logging format
app.use(express.logger('detailed'));

// setup routes
app.get(..... omitted ...);

// start server
app.listen(8080);

当然,我可以在发出请求的客户端轻松打印响应,但我更喜欢在服务器端打印.

PS:如果有帮助的话,我所有的回复都是json,但希望有一个解决方案可以处理一般的回复.

推荐答案

不确定这是否是最简单的解决方案,但您可以编写一个中间件来拦截写入响应的数据.确保禁用app.compress().

function logResponseBody(req, res, next) {
  var oldWrite = res.write,
      oldEnd = res.end;

  var chunks = [];

  res.write = function (chunk) {
    chunks.push(chunk);

    return oldWrite.apply(res, arguments);
  };

  res.end = function (chunk) {
    if (chunk)
      chunks.push(chunk);

    var body = Buffer.concat(chunks).toString('utf8');
    console.log(req.path, body);

    oldEnd.apply(res, arguments);
  };

  next();
}

app.use(logResponseBody);

Node.js相关问答推荐

Azure虚拟机上的JS Express:可疑请求?

如何解决无法获得本地颁发者证书的问题

Jest由于UUID而无法解析测试,即使在Jest中启用ESModule支持后也是如此

Mongoose更新在^8.0.3版中,许多似乎不能按预期工作

如何在.npmrc中添加 comments ?

如何呈现ejs.renderFile中包含的子模板?

无法使用NPM安装REDUX和DATEPPICER

请求正文未定义

函数声明中的异步在没有等待的函数中做什么?

Mongoose:如何使用填充进行查找

SvelteKit应用程序立即退出,没有错误

如何在Node.js的telegraf.js命令中添加参数?

如何解决未调用 Express 错误处理程序的问题

每秒从套接字传来的数据有哪些存储方式?

是Electron 的密码和登录凭据的安全存储吗?

根据 mongoDB 中存在的唯一字符串生成唯一字符串的最佳方法

当我使用 uuid 代码意外崩溃,然后工作正常?

什么是nestjs错误处理方式(业务逻辑错误vs.http错误)?

如何在 Joi 字符串验证中使用枚举值

node.js 模块和函数中this的含义