Express.js - 获取实际发布请求的正文 JSON

时间:2021-07-26 19:28:23

标签: javascript json express http http-post

我正在尝试在 express.js 中获取实际的请求正文 JSON。但是没办法。我在互联网上找到的只是如何获取 ReqBody 类型的主体,但我想要实际的 JSON,或者更可取的是,一种从 ReqBody 查询字段的方法。 (在线显示 body.usernamebody.password,但其他字段名称呢?我不能只传递字段名称 foo 并尝试获取 body.foo

这是我目前得到的:

router.post('/', function (req, res, next){
  let body = req.body;
//?????
});


2 个答案:

答案 0 :(得分:0)

如果你的帖子正文的内容类型是 JSON,那么你可以这样做:

router.post('/', express.json(), function (req, res, next){
    console.log(req.body);
    // use req.body and send a response here
});

更常见的情况是,您会在更高级别配置 express.json(),使其适用于该路由器上的所有路由,或者甚至将其放在 app 对象上,以便它也适用于所有路由器:

router.use(express.json());

router.post('/', function (req, res, next){
    console.log(req.body);
    // use req.body and send a response here
});

express.json() 中间件将检查表示 JSON 的内容类型,如果匹配,它将从传入的流中读取帖子的正文,解析在那里找到的 JSON 并将生成的 Javascript对象到 req.body。客户端放入与 Post 一起发送的 JSON 中的任何字段都将在 req.body 中。

如果您没有意识到,默认情况下 Express 不会从传入流中读取 POST 请求的正文。它留在操作系统或 nodejs 网络缓冲区中。因此,在某些代码从传入流中读取主体并对其进行解析之前,req.body 中什么也没有。通常,您会安装诸如 express.json()express.text()express.urlencoded() 之类的中间件或其他一些自定义中间件,并且每个中间件都会查看内容类型,如果它与他们知道如何解析的内容相匹配,然后他们从流中读取主体,解析它并用它做一些事情(比如把它放在 req.body 中)。其他中间件如 multer 可以从正文中读取一个或多个上传的文件。有多种类型的中间件可用于多种类型的内容类型。

如果您真的想要原始的、未解析的主体(如果是 JSON,则不需要),那么您可以使用中间件 express.raw()。 express.raw() 的不同之处在于它从流中读取主体,但不解析它,因此如果您使用该主体,它将采用任何内容类型并将原始数据作为 Buffer 对象放入 {{1 }}。无论你做什么,都不要首先使用它,因为它会读取所有主体,而其他中间件将永远不会得到任何东西。通常,如果您正在使用那个,则是在特定于请求处理程序的基础上使用它,而不是作为通用中间件使用。

<块引用>

是的,但 ReqBody 是预定义的,因为它不是原始 JSON。这就是为什么我要问如何获取原始 json

您对由 req.body 中间件解析的 JSON 的 req.body 存在误解。它将包含传入 JSON 包含的任何属性。这 100% 由客户端和它发送的 JSON 决定,根本不是由某个类预先确定的。如果客户端在此 JSON express.json() 中发送名为 foobar 的属性,并且您在该传入请求上运行 {'foobar':true} 中间件,则 express.json() 将包含值 {{1 }}。

正如我上面所解释的,您可以使用中间件 req.body.foobar 将 RAW JSON 转换为 true 对象(然后您必须自己解析它),但这不是必需的express.raw() 中间件将为您完成所有工作。


仅供参考,nodejs 源代码或 Express 源代码中似乎没有任何对名为 Buffer 的类的引用。似乎有人使用它作为引用 express.json() 对象的快捷方式,而不是这里使用的某个类。

答案 1 :(得分:-1)

尝试使用正文解析器 body-parser github