Node.js - 使用json.stringify时,Body被搞砸了

时间:2014-06-10 18:58:07

标签: jquery json node.js express

客户端:

$.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: {}

});

我理解,因为我的数组是空的,所以没有发布,但我完全混淆了为什么输出在字符串化时如此混乱。它是由身体解析器引起的吗?

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

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:2)

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

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