将Express的POST数组数据解析为JSON

时间:2011-05-08 13:34:12

标签: javascript node.js connect express

我的应用是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?!

4 个答案:

答案 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
}