在ExpressJS中使用JSON与数组

在网页上,我使用jQuery发布一些JSON:

$.post('/url', data); 

我的数据是一个JavaScript对象,它包含一些值和一个数组。 JSON.stringify(data)看起来像:

 {"favoriteAnimal":"piglet", "okayAnimals":["cats","dogs"]} 

我正在使用ExpressJS(与body-parser中间件连接)在NodeJS webapp中使用这个JSON。 我可以像req.body.favoriteAnimal检索最喜欢的动物,它给了我所有的罚款和丹迪stringpiglet

但是,我如何访问数组中的值?

 req.body.favoriteAnimal // piglet req.body.okayAnimals // undefined req.body.okayAnimals[] // syntax error 

这工作…

 req.body['okayAnimals[]'] 

但味道很腥 如果正在被POST的原始数据在数组中只包含一个元素(它只返回一个string),它也不会返回一个数组。

有没有什么事情发生在JSON的jQuery编码或ExpressJS中的解码正在进行,这使得我不能像req.body.okayAnimals一样访问它并每次获取数组?

凯文的回答几乎让我在那里。

$.post('/url', JSON.stringify(data))将发送一个更接近一个string。 不幸的是,jQuery的$.post设置了错误的头文件

 Content-Type:application/x-www-form-urlencoded; charset=UTF-8 

ExpressJS的body-parser将无法正确处理。 你结束了

 req.body={"{\"favoriteAnimal\":\"piglet\",\"okayAnimals\":[\"cats\",\"dogs\"]}":""} 

我重写了我发送数据的方式。

 $.ajax({ url: '/url', type: 'POST', data: data, contentType: 'application/json; charset=utf-8', dataType: 'json' }) 

我看到我的浏览器正在发送正确的标题

 Content-Type:application/json; charset=UTF-8 

并观察

 req.body={"favoriteAnimal":"piglet","okayAnimals":["cats","dogs"]} 

JavaScript对象和JSON是两个非常不同的东西,这是你所看到的问题的根源。 你传递给$.post()的实际上是一个对象,而不是json,因此在被发送到节点之前被jQuery转换为一个paramstring。 在这种情况下,paramstring是:

 favoriteAnimal=piglet&okayAnimals[]=cats&okayAnimals[]=dogs 

这当然解释了为什么okAnimals[]财产存在于正文。

我很惊讶,你用来分析正文的中间件没有正确地select它,但是不pipe你是否应该把jsonstring传递给$.post如果你想发送它。

 $.post('/url', JSON.stringify(data));