14

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

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' }
   ]
}
4

3 回答 3

13

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

https://github.com/ljharb/qs

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

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

于 2011-11-25T18:54:34.330 回答
6

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

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

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

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

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

于 2011-01-03T22:35:47.683 回答
6

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

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

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

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

于 2015-03-02T17:51:00.983 回答