在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));