我的应用是Node.js使用Express。
使用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?!
答案 0 :(得分:17)
在您的客户端:
$.ajax({
type: 'POST',
data: JSON.stringify(data),
contentType: 'application/json',
url: '/endpoint'
});
在您的服务器上:
console.log('POST: ',req.body);
问题是jQuery在发送之前搞砸了你的数据。如果你设置了正确的MIME类型,那么它就会让你自由。
答案 1 :(得分:2)
你能发布你的客户端jQuery代码吗?默认情况下,jQuery将以urlencoded方式发送数据,而不是JSON。有关确保jQuery发送真实JSON数据的方法,请参阅this question's answer。
仅供参考express/connect bodyParser middleware只使用JSON.parse来解析JSON(和qs.parse来解析urlencoded数据)。我不认为这些代码中有任何明显的错误。因此,我认为您应该仔细检查您从浏览器发送的数据。
答案 2 :(得分:1)
在寻找其他一些nodejs时,我遇到了这个老问题。
jQuery.ajax()
函数使用JSON发送数据是一种常见的误解。数据由jQuery作为POST数据发送,而不是JSON字符串。因此,所有数据类型(包括数组中的数字)都将作为字符串发送。
这意味着express将'array'键解析为一个字符串,并且因为一个数组在javascript中没有一个字符串键而不是一个对象,所以它被强制转换为一个对象。
答案 3 :(得分:-4)
这一切都是有道理的;您可以使用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
}