Express 4.17 req.body 正在作为缓冲区打印

Express 4.17 req.body is being printed as buffer

我想澄清的是我的 Express 应用程序中 console.logging req.body 的时间。当我期待一个 JSON 对象时,我最终得到一个 buffer/string 或某种十六进制。我正在使用邮递员发送原始 json 正文。 以下是源代码和 terminal/postman 结果的一些视觉效果。

const express = require('express');
const bodyParser = require('body-parser');
const { randomBytes } = require('crypto');

const app = express();
app.use(express.raw({type: "application/json"}));
app.use(express.json({strict: false}));
app.use(express.urlencoded({extended: false}));

const posts = {};

app.get('/posts', (req, res) => {
  res.send(posts);
});

app.post('/posts', (req, res) => {
  const id = randomBytes(4).toString('hex');
  const { title } = req.body;
  
  console.log(req.body)
  posts[id] = {
    id,
    title: title
  };

  res.status(201).send(posts[id]);
});

app.listen(4000, () => {
  console.log('Listening on 4000');
});

Console.log terminal of buffer/hex/string

Postman body

Postman Raw String

app.use(express.raw({type: "application/json"})); 将为您提供一个 Buffer 对象,因为这是您的第一个可能处理该 MIME 类型的中间件,这就是您将要为任何 application/json 请求获得的内容。

来自 Express docexpress.raw():

This is a built-in middleware function in Express. It parses incoming request payloads into a Buffer

目前还不清楚为什么要使用 express.raw(),因为这对于 JSON 有效载荷来说并不常见,但是这样做时,您将获得 Buffer - 就是这样作品。更典型的做法是将 express.json() 用于 JSON 有效负载,并让它解析您的 JSON,以便 req.body 包含一个实际的 Javascript 对象。

如果您删除 app.use(express.raw({type: "application/json"})); 行代码并让 app.use(express.json()); 行代码在它处理 application/json 有效载荷后立即处理,那么您将在 req.body.

请记住,当使用中间件时,它们是按照声明的顺序处理的,对于这种特定类型的中间件,第一个匹配并从传入流中读取主体的中间件优先,none之后的其他人将能够完成他们的工作(因为传入的流已经被读取)。