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 }