Node Express JSON正文解析



我是Express的新手,所以对于这个问题我已经研究了很多,但我做不好。所以我需要从Frontend传递一个像["1","2","3","4","5"]这样的数组作为有效载荷,在Express中我需要接受它并用它做一些事情。到目前为止,我可以从Frontend发送它并在Express中接收,但我收到的内容看起来不太对劲。在快递中我收到:

POST / 200 3.239 ms - 97
{ '"1","2","3","4","5"': '' }

所以我对此无能为力。我试图发送一个名为params的对象并接收它来做一些事情,但也没有成功。

前端标头类似于此

Request URL: http://localhost:5000/
Request Method: POST
Status Code: 200 OK
Remote Address: [::1]:5000
Referrer Policy: strict-origin-when-cross-origin
Access-Control-Allow-Origin: *
Connection: keep-alive
Content-Length: 36
Content-Type: application/json; charset=utf-8
Date: Mon, 13 Dec 2021 23:06:58 GMT
ETag: W/"24-sEnfXlyl7goDTpCx3bZVIGauJsc"
Keep-Alive: timeout=5
X-Powered-By: Express
Accept: application/json, text/plain, */*
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Connection: keep-alive
Content-Length: 21
Content-Type: application/x-www-form-urlencoded
DNT: 1
Host: localhost:5000
Origin: http://localhost:3000
Referer: http://localhost:3000/
sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="96", "Google Chrome";v="96"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.93 Safari/537.36

与此相关的快速设置类似于

var express = require("express");
...
var app = express();
...
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.post("/", (req, res) => {
res.json({ requestBody: req.body });
});

那么,我如何在ReactJS中从前端发送一个数组["1","2","3","4","5"]作为主体的一部分,然后在express中接受它作为数组并使用它呢?

作为请求显示的内容:

POST / 200 3.239 ms - 97
{ '"1","2","3","4","5"': '' }

并且,您显示的标题为:

Content-Type: application/x-www-form-urlencoded

不匹配。您的数据以纯文本形式发送。它不是application/jsonapplication/x-www-form-urlencoded,所以你没有为它安装主体解析器,所以Express不知道该怎么处理它。事实上,Express甚至不读取它,它只是停留在传入流中。

您没有显示客户端代码,但客户端需要使content-type和您用POST发送的正文内容的编码真正匹配。然后,您需要在Express方面为content-type提供一个body解析器。

由于这是一个数据数组,我建议使用JSON并发送application/JSON编码的数据。然后,您现有的express.json()中间件将为您读取并解析它,您可以读取req.body中的数据。

如果您需要修复客户端的帮助,请向我们展示发送此消息的客户端代码。

例如,如果您使用fetch()从客户端发送此消息,下面是fetch()的MDN文档中的一个示例:

// Example POST method implementation:
async function postData(url = '', data = {}) {
// Default options are marked with *
const response = await fetch(url, {
method: 'POST', // *GET, POST, PUT, DELETE, etc.
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data) // body data type must match "Content-Type" header
});
return response.json(); // parses JSON response into native JavaScript objects
}
postData('https://example.com/answer', { answer: 42 })
.then(data => {
console.log(data); // JSON data parsed by `data.json()` call
});

您应该NOT发送一个名为params的对象。由于它的POST请求,您应该将数组作为请求body的属性发送。然后,它将在Express应用程序的req.body属性中可用。

最新更新