收到请求时使用 morgan 记录 POST 正文大小

Posted

技术标签:

【中文标题】收到请求时使用 morgan 记录 POST 正文大小【英文标题】:Logging POST body size using morgan when request is received 【发布时间】:2018-12-26 19:57:20 【问题描述】:

我正在使用“摩根”库来记录我的请求、所需时间和响应大小。

但是,对于 POST 请求,有没有一种方法可以在收到 POST 请求时记录其正文大小?

【问题讨论】:

【参考方案1】:
    使用 Morgan 模块中的自定义令牌格式。 为正文创建一个标记,然后将其添加到您的格式中。

这是您需要添加到app.js 的工作示例代码 sn-p:

morgan.token('body', (req, res) => JSON.stringify(req.body));
app.use(morgan(':method :url :status :response-time ms - :res[content-length] :body - :req[content-length]'));

【讨论】:

【参考方案2】:

您可以编写自己的中间件

 app.use((req, res, next) => 
    console.log(req.body);
    next();
  );

您还可以检查请求是 POST 还是 PUT 等。

if (req.method === "POST") 
       // log the budy
    

【讨论】:

【参考方案3】:

在浏览morgan 文档大约一个小时后,我找到了解决问题的好方法。

可以在请求时使用morgan 库本身来完成日志记录,而不是使用morgan-body。甚至可以很容易地记录 POST 正文的长度。

这是如何做到的:

app.use(morgan(format: 'POST body length in bytes :req[Content-Length]', immediate: true))

这里的'format'选项定义了日志的格式,'immediate'选项在收到请求时写入日志

【讨论】:

【参考方案4】:

您可以使用morgan-body,它捕获所有请求类型,无论是post还是get

import morganBody from 'morgan-body';
import express from 'express';
import bodyParser from 'body-parser';

const app = express();

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

// hook morganBody to express app
morganBody(app);

【讨论】:

以上是关于收到请求时使用 morgan 记录 POST 正文大小的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring Webflux Java 中记录请求正文

未收到 WinHttp POST 正文

AJAX Post 请求错误:“不能为空”,[验证::required] 在 POST 正文中发送 JSON 对象时

你应该如何在 TypeScript 中为 Morgan 创建 Winston 记录器流

Node.js 模块之 morgan中间件记录日志

如何使用JSON正文在REST API POST方法中传递多个记录