繁体   English   中英

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

[英]Express.js - get the actual post request's body JSON

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

这是我到目前为止所得到的:

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


如果您的帖子正文的内容类型是 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.bodyreq.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 对象放入req.body . 无论你做什么,都不要首先使用它,因为它会读取所有主体,而其他中间件将永远不会得到任何东西。 通常,如果您正在使用那个,您将在特定于请求处理程序的基础上使用它,而不是作为通用中间件。

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

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

正如我上面解释的,您可以使用中间件express.raw()将 RAW JSON 转换为Buffer对象(然后您必须自己解析它),但这不是express.json()中间件所必需的会为你做这一切。


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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM