首页 文章

在ExpressJS中使用JSON和数组

提问于
浏览
4

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

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

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

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

我正在使用ExpressJS(与身体解析器中间件连接)在NodeJS webapp中使用这个JSON . 我可以找回喜欢的动物,如 req.body.favoriteAnimal ,它给我字符串 piglet ,这一切都很好,花花公子 .

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

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

这有效......

req.body['okayAnimals[]']

......但闻起来很腥 . 如果正在POST的原始数据在其数组中只包含一个元素(它只返回一个字符串),它也不会返回数组 .

JSON的jQuery编码是否正在发生什么事情或ExpressJS中的解码正在发生什么事情阻止我像 req.body.okayAnimals 那样访问它并且每次都得到一个数组?

2 回答

  • 2

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

    $.post('/url', JSON.stringify(data)) 将发送一个更近的字符串 . 不幸的是,jQuery的 $.post 设置了错误的 Headers

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

    ExpressJS的正文解析器无法正确处理 . 你结束了

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

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

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

    我看到我的浏览器发送了正确的 Headers

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

    并观察

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

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

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

    这当然解释了为什么身体上存在 okAnimals[] 属性 .

    我正确地选择了它,但是如果你想按原样发送它,你应该将json字符串传递给 $.post .

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

相关问题