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

Avi*_*aro 3 javascript json http http-post express

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

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

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


Run Code Online (Sandbox Code Playgroud)

jfr*_*d00 10

如果您的帖子正文的内容类型是 JSON,那么您可以执行以下操作:

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

更常见的是,您可以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
});
Run Code Online (Sandbox Code Playgroud)

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

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

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

正如我上面所解释的,您可以使用中间件express.raw()将 RAW JSON 放入Buffer对象中(然后您必须自己解析它),但这不是必需的,因为express.json()中间件会为您完成所有这些工作。


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