【问题标题】:Node.js - Body is messed up when using json.stringifyNode.js - 使用 json.stringify 时,正文搞砸了
【发布时间】:2014-07-31 16:19:49
【问题描述】:

客户:

$.ajax({
  url: some_url,
  type: 'post',
  dataType: 'json',
  data: JSON.stringify({myArray: []})
  ...
}

$.ajax({
  url: some_url,
  type: 'post',
  data: {myArray: []}
  ...
}

服务器:

var app = express();
app.use(bodyParser()); // body-parser module
app.use(function(req, res, next){
  console.log(req.body);

  // When stringified, prints: { '{"myArray":': { ']': '' } }
  // When not stringified, prints: {}

});

我知道因为我的数组是空的,所以没有发布它,但我完全不明白为什么在字符串化时输出如此混乱。是body parser引起的吗?

我要做的就是检索我的数组并在其上循环。如果它是空的,那就这样吧。

谢谢!

【问题讨论】:

    标签: jquery json node.js express


    【解决方案1】:

    bodyParser()中间件根据请求的Content-Type标头进行解码,可以通过contentType option设置:

    data: JSON.stringify({ myArray: [] }),
    contentType: 'application/json',
    

    如果不指定 contentType 是 JSON,解析器将尝试基于 URL 编码的默认值进行解码,从而产生您看到的 body 结构。

    【讨论】:

    • 我接受了 mscdex 的回答,因为它解释了为什么身体如此混乱,但你的回答同样好,如果可以的话,我会接受。
    【解决方案2】:

    首先,dataType 只会影响服务器响应。与请求数据无关。

    其次,损坏对象的原因是默认情况下 jQuery 的 ajax() 发送 Content-Typeapplication/x-www-form-urlencoded。此外,body-parser 中间件默认使用qs npm 模块来解析application/x-www-form-urlencoded,而不是内置的querystring 节点模块。 qs 模块支持querystring 之外的功能,包括嵌套语法(例如foo[bar]=bazfoo[]=baz)。所以qs 看到[ 并认为它是嵌套语法的开始。从那里开始,它取决于qs 的实现,以了解格式错误的输入的输出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-29
      • 2010-11-21
      • 2011-08-17
      • 2010-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多