POST数组数据到Express被parsing为JSON

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

使用jQuery POST从我的客户端发送testing数据:

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

}

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

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

我想获得数组笔记作为一个数组插入到我的数据库。 我错过了什么?


由于我不能自己添加一个答案8小时(跆拳道?),但它并没有真正回答为什么Express.bodyParser不正确parsingJSON

好的我可以通过使用:

 JSON.stringify ( data ) 

在客户端然后服务器端使用

 JSON.parse( req.rawBody ) 

这感觉不对,为什么Express.bodyParser没有正确parsingJSON?

在你的客户端上:

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

在你的服务器上:

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

问题是jQuery在发送数据之前会将其与您的数据混淆在一起。 如果您设置了正确的MIMEtypes,则会使您免费。

你可以发布你的客户端jQuery代码吗? 默认情况下,jQuery将以urlencoded方式发送数据,而不是JSON。 查看这个问题的答案 ,以确保jQuery发送真正的JSON数据。

FYI 快速/连接bodyParser中间件只是使用JSON.parse来parsingJSON(和qs.parse来parsingurlencoded数据)。 我不认为这些代码中有任何明显的错误。 因此,我认为你应该仔细检查你从浏览器发送的数据。

在寻找其他nodejs的东西的时候遇到了这个老问题。

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

这意味着express将“数组”键parsing为一个string,并且由于数组不能在javascript中具有string键而不是对象,因此将其转换为对象。

这一切都是有道理的。 你可以使用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 }