Node.js – 使用查询string发送和接收数组作为GET / POST

我有下面的代码,但它似乎并没有工作:

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

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

https://github.com/visionmedia/node-querystring

“用于支持嵌套的节点的查询stringparsing器,因为它已从0.3.x中删除,所以该库提供了以前和通常期望的行为(以及快两倍)”

如果有人能告诉我为什么从0.3.x版本中删除,我会给你一个赞扬你的评论。 (我希望我对恢复Node.js的信心。)

为了确认我上面的注释,节点的querystring.stringify函数不会处理嵌套数组(在编写时)。

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

请注意,它处理一个级别的数组,但不会recursion。 当它find一个数组时,它使用stringifyPrimitive来编码数组的值。 你可以看到stringifyPrimitive不处理数组,只有数字,布尔和string。

正如我在我的评论中所build议的那样,考虑到您正在使用POST请求,更好的办法是使用JSON编码来处理复杂的数据结构。

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

不要使用querystring.parse重新创build一个作为string发送的JSON对象。 改用JSON.parse。 并使用JSON.stringify而不是querystring.stringify

查询string在发送URL中编码的参数或发布表单时非常有用。 但是如果只发送一个包含所有数据的JSON对象,就没有意义。

在你的场景中,我将closures查询string库并使用已经包含的JSON库。 这将是更干净,更快。

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