2

我正在将 JSON(从客户端)发送到 NodeJS 服务器,如下所示:

$.ajax({

  type: "POST",
  dataType: "jsonp",
  url: "www.xyz.com/save",
  data: {

    designation: "Software Developer",

    skills: [

      "",
      "ASP.NET",
      "PHP",
      "",
      "",
      "",
      "NodeJS",
      "",
      ""

    ]    

  } 

});

在接收端(即 NodeJS 服务器),我打印 JSON(带有 console.log)如下:

save = module.exports = {};

save.setup = function( app ) {

  app.get( '/save', function(req, res) {

    console.log(req.query);

  }); 

}

问题是它打印以下内容

{

  designation: "Software Developer",

  skills: [

    "ASP.NET",
    "PHP",
    "NodeJS",

  ]    

}

即它缺少技能数组的空字符串值(我从req.query 中得到它)。

我还检查了网络面板(在开发人员工具中)。它还显示了正确的 JSON。

有谁知道可能出了什么问题?

4

1 回答 1

3

Connect(构建 Express)使用第三方qs模块而不是内置的querystring模块来解析 URL 查询字符串。

您的数据被 jQuery 序列化为以下查询字符串:

designation=Software+Developer&skills%5B%5D=&skills%5B%5D=ASP.NET&skills%5B%5D=PHP&skills%5B%5D=&skills%5B%5D=&skills%5B%5D=&skills%5B%5D=NodeJS&skills%5B%5D=&skills%5B%5D=

(这是命名的多个参数skills[],其中包括空格。)

如果我将该字符串提供给querystring.parse()内置解析器,我会得到您期望的结果:

{ designation: 'Software Developer',
  'skills[]':
   [ '',
     'ASP.NET',
     'PHP',
     '',
     '',
     '',
     'NodeJS',
     '',
     '' ] }

如果我将字符串提供给qs.parse,我会得到与您在应用程序中看到的相同的结果。

这种行为是一个悬而未决的qs问题,但一年半以来一直没有得到解决。您可以向 TJ 提出问题或尝试自己解决问题。

同时,您可以通过使用querystring而不是qs. 我只是url.parse用来重新解析原始 URL。

var url = require('url');

app.get('/', function(req, res) {
    console.log(url.parse(req.originalUrl, true).query);
});
于 2013-11-07T17:53:50.990 回答