【问题标题】:Node.js - Send and receive Array as GET/POST using querystringNode.js - 使用查询字符串以 GET/POST 形式发送和接收数组
【发布时间】:2011-06-02 23:17:39
【问题描述】:

我有以下代码,但它似乎不起作用:

var post_req = {
    array: [
        [ {
            param1: 'something',
            param2: 123
        } ],
        [ ],
        [ ],
        [ {
            param2: 'something',
            param4: 1234,
            param1: 'hello'
        } ]
    ]
};
var data_send = querystring.stringify(post_req);

var request = client.request('POST', '/', headers);
request.end(data_send);

if( req.method == 'POST' ) {
    req.addListener('data', function(chunk)
    {
        POST = querystring.parse(chunk);
        console.log(POST);
    }
}

我最终得到了 5 个子数组,对应于对象中的 5 个参数,但它们的名称中有额外的 '][' 字符:

{ array: 
   [ { '][param1': 'something' }
   , { '][param2': '123' }
   , { '][param2': 'something' }
   , { '][param4': '1234' }
   , { '][param1': 'hello' }
   ]
}

【问题讨论】:

  • 看起来节点的查询字符串模块不是为处理嵌套数组(可能是空数组)而设计的。如果是 POST 请求,您可以改用 JSON.stringify 和 JSON.parse 吗?

标签: node.js request.querystring


【解决方案1】:

为了确认我上面的评论,节点的querystring.stringify 函数不会处理嵌套数组(在撰写本文时)。

你可以在https://github.com/ry/node/blob/master/lib/querystring.js看到stringify的来源

请注意,它处理一级数组,但不会递归。当它找到一个数组时,它使用stringifyPrimitive 对数组的值进行编码。可以看到stringifyPrimitive不处理数组,只处理数字、布尔值和字符串。

正如我在评论中所建议的那样,鉴于您正在使用 POST 请求,一个更好的主意是对您的复杂数据结构使用 JSON 编码。

或者按照@FriendlyDev 的建议使用https://github.com/visionmedia/node-querystring

【讨论】:

  • 以防万一有人搜索这个。我遇到了同样的问题,关于处理一级数组,但它不会递归。我解决它的方法是在 javascript 中创建对象,json 字符串化对象并将该字符串附加到单个查询参数,即?array=jsonString。然后在后面的代码(node.js & express)中,我用 req.query.array 拾取单数参数并使用 JSON.parse 取回 obj,即array = JSON.parse(req.query.array);link
【解决方案2】:

有一个新的节点包可以解决这个问题:“npm install qs”。

https://github.com/ljharb/qs

“用于支持嵌套的节点的查询字符串解析器,因为它已从 0.3.x 中删除,所以这个库提供了以前和通常需要的行为(并且速度是原来的两倍)”

如果有人能告诉我为什么将它从 0.3.x 中删除,我会为你的评论投赞成票。 (我希望恢复对 Node.js 的信心。)

【讨论】:

    【解决方案3】:

    不要使用 querystring.parse 来重新创建作为字符串发送的 JSON 对象。改用 JSON.parse。并使用 JSON.stringify 而不是 querystring.stringify

    当您发送在 url 中编码的参数或发布表单时,查询字符串很有用。但是,如果您只发送一个包含所有数据的 JSON 对象,那么使用它是没有意义的。

    在您的场景中,我将关闭查询字符串库并使用已包含的 JSON 库。它会更干净,更快。

    http://www.json.org/js.html

    【讨论】:

      猜你喜欢
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      相关资源
      最近更新 更多