【问题标题】:Express 4.17 req.body is being printed as bufferExpress 4.17 req.body 被打印为缓冲区
【发布时间】:2021-04-12 03:44:48
【问题描述】:

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

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

【问题讨论】:

  • 欢迎来到stackoverflow。当代码是您问题的一部分时,它应该作为文本而不是图像粘贴到您的问题中。这有很多很好的理由:它可以被搜索索引,回答的人可以将粘贴部分复制到他们的答案中而无需重新输入,对于那些有视力问题的人来说更容易访问等等......请解决您的问题并粘贴将您的问题编码为文本并将其格式化为适当的代码。
  • 既然您是新来的,我已经给您提供了查看您的图像并发布答案的礼貌。请修复此问题,以将您的代码显示为文本,并按照正确的程序处理未来的问题。
  • 请不要只是发布和消失。如果您在第一个小时内没有多次回访,那么您将错过与那些试图提供帮助的人互动的最佳机会。至于我,我将有一段时间不再在线,所以希望我的回答足够,因为我们错过了讨论答案中的任何内容是否对您不明确的机会。
  • 非常感谢!我现在正在检查答案并修复帖子。从东部时间上午 12 点开始,我在发帖时就睡着了。

标签: express request buffer


【解决方案1】:

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

来自Express docexpress.raw()

这是 Express 中内置的中间件功能。它解析传入的 将有效负载请求到缓冲区中

不清楚为什么要使用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 中获得解析数据。

请记住,在使用中间件时,它们会按照声明的顺序进行处理,对于这种特定类型的中间件,第一个匹配并从传入流中读取正文的中间件优先,之后的其他中间件都不能完成他们的工作(因为传入的流已经被读取)。

【讨论】:

    猜你喜欢
    • 2020-12-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多