我如何使用 nodejs 在服务器上接收与客户端 post 数据格式相同的 post 数据?
How do i receive post data at server same as client post data format using nodejs?
我有一个 post 格式如下的数据
{"geoJSON":{"type":"Feature","geometry":{"type":"LineString","coordinates":[[-102.038635,36.800488],[-94.567716,36.800488],[-96.149793,43.381098],[-104.060178,43.508721]]}}}
期望服务器上的格式相同但收到的格式如下
{"geoJSON":{"type":"Feature","geometry":{"type":"LineString","coordinates":[["-102.038635","36.800488"],["-94.567716","36.800488"],["-96.149793","43.381098"],["-104.060178","43.508721"]]}}}
您可以在 coordinates
属性 中看到差异。服务器收到的 coordinates
数组中的每个值都添加了双引号。如何获得与客户端 post 数据相同的 coordinates
数组?
我的应用程序配置了 expressJS 并使用了 body-parser。解决问题需要任何其他设置吗?
app.use(bodyParser.urlencoded({ limit: '50mb' }));
app.use(bodyParser.json({ limit: '50mb' }));
提前致谢。
首先,从 @bumblebeen 开始,HTTP 将所有内容都理解为字符串,因此将所有内容都转换为字符串。您可以使用 Number.parseInt
来解析它
此外,这无关紧要,但 express 现在附带了它自己的正文解析器,您可以使用它。因此,您无需调用 bodyParser.json
,只需调用 express.json
编辑
根据评论所述,您可以有一个名为 parseCoordinates
的函数
function parseCoordinates(coordinates) {
return coordinates.map(inner => {
return Array.isArray(inner) ? inner.map(elem => parseFloat(elem)) : parseFloat(inner);
});
}
{"geoJSON":{"type":"Feature","geometry":{"type":"LineString","coordinates":[[-102.038635,36.800488],[-94.567716,36.800488],[-96.149793,43.381098],[-104.060178,43.508721]]}}}
上面其实是一个JavaScript对象
{"geoJSON":{"type":"Feature","geometry":{"type":"LineString","coordinates":[["-102.038635","36.800488"],["-94.567716","36.800488"],["-96.149793","43.381098"],["-104.060178","43.508721"]]}}}
上面实际上是一个JSON.
正如建议的答案之一,每当您向服务器发送数据时,有效负载中的所有内容都会自动转换为字符串。您应该将值转换为数字。
此外,我认为任何解析都无法做到这一点,您应该为此编写自己的代码。我之所以这么说是因为,解析器永远不知道原始值是客户端发送的字符串还是实际上是一个数字,因为所有的键和值都将变成字符串。
假设我有
var payload = {"geoJSON":{"type":"Feature","geometry":{"type":"LineString","coordinates":[[-102.038635,36.800488],[-94.567716,36.800488],[-96.149793,43.381098],[-104.060178,43.508721]]}}}
在发送服务器之前使用 JSON.stringify(payload) 对其进行字符串化。
payload = JSON.stringify(payload)
// after this code then sending payload to server
在服务器使用JSON.parse(payload)使用这个
// server nodejs
var receivedContent = JSON.parse(payload)
// then you can using receivedContent with format you want
我有一个 post 格式如下的数据
{"geoJSON":{"type":"Feature","geometry":{"type":"LineString","coordinates":[[-102.038635,36.800488],[-94.567716,36.800488],[-96.149793,43.381098],[-104.060178,43.508721]]}}}
期望服务器上的格式相同但收到的格式如下
{"geoJSON":{"type":"Feature","geometry":{"type":"LineString","coordinates":[["-102.038635","36.800488"],["-94.567716","36.800488"],["-96.149793","43.381098"],["-104.060178","43.508721"]]}}}
您可以在 coordinates
属性 中看到差异。服务器收到的 coordinates
数组中的每个值都添加了双引号。如何获得与客户端 post 数据相同的 coordinates
数组?
我的应用程序配置了 expressJS 并使用了 body-parser。解决问题需要任何其他设置吗?
app.use(bodyParser.urlencoded({ limit: '50mb' }));
app.use(bodyParser.json({ limit: '50mb' }));
提前致谢。
首先,从 @bumblebeen 开始,HTTP 将所有内容都理解为字符串,因此将所有内容都转换为字符串。您可以使用 Number.parseInt
此外,这无关紧要,但 express 现在附带了它自己的正文解析器,您可以使用它。因此,您无需调用 bodyParser.json
,只需调用 express.json
编辑
根据评论所述,您可以有一个名为 parseCoordinates
function parseCoordinates(coordinates) {
return coordinates.map(inner => {
return Array.isArray(inner) ? inner.map(elem => parseFloat(elem)) : parseFloat(inner);
});
}
{"geoJSON":{"type":"Feature","geometry":{"type":"LineString","coordinates":[[-102.038635,36.800488],[-94.567716,36.800488],[-96.149793,43.381098],[-104.060178,43.508721]]}}}
上面其实是一个JavaScript对象
{"geoJSON":{"type":"Feature","geometry":{"type":"LineString","coordinates":[["-102.038635","36.800488"],["-94.567716","36.800488"],["-96.149793","43.381098"],["-104.060178","43.508721"]]}}}
上面实际上是一个JSON.
正如建议的答案之一,每当您向服务器发送数据时,有效负载中的所有内容都会自动转换为字符串。您应该将值转换为数字。
此外,我认为任何解析都无法做到这一点,您应该为此编写自己的代码。我之所以这么说是因为,解析器永远不知道原始值是客户端发送的字符串还是实际上是一个数字,因为所有的键和值都将变成字符串。
假设我有
var payload = {"geoJSON":{"type":"Feature","geometry":{"type":"LineString","coordinates":[[-102.038635,36.800488],[-94.567716,36.800488],[-96.149793,43.381098],[-104.060178,43.508721]]}}}
在发送服务器之前使用 JSON.stringify(payload) 对其进行字符串化。
payload = JSON.stringify(payload)
// after this code then sending payload to server
在服务器使用JSON.parse(payload)使用这个
// server nodejs
var receivedContent = JSON.parse(payload)
// then you can using receivedContent with format you want