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 doc 的 express.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之后的其他人将能够完成他们的工作(因为传入的流已经被读取)。
我想澄清的是我的 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 doc 的 express.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之后的其他人将能够完成他们的工作(因为传入的流已经被读取)。