POST 数组数据到 Express 被解析为 JSON

发布于 2024-11-05 22:23:15 字数 642 浏览 3 评论 0原文

我的应用程序是使用 Express 的 Node.js。

使用 jQuery POST 从我的客户端发送此测试数据:

{
title: 'hello',
notes: [
{title: 'note 1'},
{title: 'note 2'}
]

}

这是我的服务器代码中的结果:

{ title: 'hello', notes: { '0': { title: 'note 1' }, '1': { title: 'note 2' } } }

我想要获取注释数组以数组形式插入到我的数据库中。我缺少什么?


因为我自己无法在 8 小时内添加答案(wtf?),但它并没有真正回答为什么 Express.bodyParser 无法正确解析 JSON

方式让它工作:

JSON.stringify ( data )

好吧,我可以通过使用以下 客户端然后服务器端使用

JSON.parse( req.rawBody )

这确实感觉不对,为什么 Express.bodyParser 不能正确解析 JSON?!

My app is Node.js using Express.

Sending this test data from my client using jQuery POST:

{
title: 'hello',
notes: [
{title: 'note 1'},
{title: 'note 2'}
]

}

And this is the result in my server code:

{ title: 'hello', notes: { '0': { title: 'note 1' }, '1': { title: 'note 2' } } }

I want to get the array of notes to insert into my DB as an Array. What am I missing?


As I can't add an answer myself for 8 hours (wtf?) BUT it does not really answer why Express.bodyParser does not parse JSON correctly

Ok I can get it to work by using:

JSON.stringify ( data )

on the client then server side using

JSON.parse( req.rawBody )

This does feel wrong and why does Express.bodyParser not parse JSON correctly?!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

感情旳空白 2024-11-12 22:23:15

在你的客户端上:

$.ajax({
  type: 'POST',
  data: JSON.stringify(data),
  contentType: 'application/json',
  url: '/endpoint'
});

在你的服务器上:

console.log('POST: ',req.body);

问题是 jQuery 在发送数据之前对你的数据进行了处理。如果您设置了正确的 MIME 类型,那么您就可以自由地进行操作。

On your client:

$.ajax({
  type: 'POST',
  data: JSON.stringify(data),
  contentType: 'application/json',
  url: '/endpoint'
});

On your server:

console.log('POST: ',req.body);

The problem is jQuery mucks around with your data before sending it. If you set the right MIME type, than it leaves you free.

暮凉 2024-11-12 22:23:15

你能发布你的客户端 jQuery 代码吗?默认情况下,jQuery 将以 urlencoded 形式发送数据,而不是 JSON。请参阅此问题的答案,了解确保 jQuery 发送真实 JSON 数据的方法。

仅供参考 express/connect bodyParser 中间件 仅使用 JSON .parse 解析 JSON(和 qs.parse 解析 urlencoded 数据)。我认为这些代码中没有任何明显的错误。因此,我认为您应该仔细检查从浏览器发送的数据。

Can you post your client side jQuery code, please? By default jQuery will send data as urlencoded, not JSON. See this question's answer for the way to ensure jQuery sends real JSON data.

FYI the express/connect bodyParser middleware simply uses JSON.parse to parse JSON (and qs.parse to parse urlencoded data). I don't think there are any glaring bugs in those code. Thus I think you should double-check the data you are sending from the browser.

坏尐絯 2024-11-12 22:23:15

我在寻找其他 Nodejs 内容时遇到了这个老问题。

一个常见的误解是,jQuery.ajax() 函数使用 JSON 发送数据。数据由 jQuery 作为 POST 数据而不是 JSON 字符串发送。因此,所有数据类型(包括数组中的数字)都作为字符串发送。

这意味着express将“数组”键解析为字符串,并且由于数组在javascript中不能在没有对象的情况下具有字符串键,因此它被转换为对象。

I came across this old question when looking for some other nodejs stuff.

It is a common misconception that jQuery.ajax() functions send data using JSON. Data is sent by jQuery as POST data and not a JSON string. As such all data types (including the numbers in your array) are sent as strings.

This means that express parses the 'array' keys as a string, and since an array can't have a string key in javascript without being an object, it is cast to an object.

梦回旧景 2024-11-12 22:23:15

那么这一切就都有意义了;您可以使用 Express.bodyParser 来获得这样的结果,或者您可以使用 JSON.parse 甚至 eval('(' + myPostedData + ')' ) 获取没有索引的结果对象。

根据您当前的设置,您需要做的就是:

for(var j = 0; j < myVariable.notes.length; j++)
{
    var currentNode = myVariable.notes[j];

    //currentode.title should be 'note 1' for j = 0, etc
}

It all makes sense then; you can use Express.bodyParser to get a result like that, or you can use JSON.parse or even eval('(' + myPostedData + ')') to get a result object without the indexes.

With your current setup, all you need to do is:

for(var j = 0; j < myVariable.notes.length; j++)
{
    var currentNode = myVariable.notes[j];

    //currentode.title should be 'note 1' for j = 0, etc
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文