Node.js - отправлять и получать массив как GET / POST, используя строку запроса - PullRequest
12 голосов
/ 03 января 2011

У меня есть следующий код, но он не работает:

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

Ответы [ 3 ]

11 голосов
/ 25 ноября 2011

Существует новый пакет узлов, который исправляет это: «npm install qs».

https://github.com/ljharb/qs

»Анализатор строки запроса для узла, поддерживающего вложение, так как он был удален из 0.3.х, так что эта библиотека обеспечивает предыдущее и обычно желаемое поведение (и вдвое быстрее) "

Если кто-нибудь может сказать мне, почему он был удален из 0.3.x, я дам вам отзыв для вашего комментария.(Я хочу, чтобы мое доверие к Node.js восстановилось.)

6 голосов
/ 04 января 2011

Чтобы подтвердить мой комментарий выше, функция узла querystring.stringify не будет обрабатывать вложенные массивы (на момент написания).

Вы можете увидеть источник stringify в https://github.com/ry/node/blob/master/lib/querystring.js

Обратите внимание, что он обрабатывает один уровень массивов, но не рекурсивно.Когда он находит массив, он использует stringifyPrimitive для кодирования значений массива.Вы можете видеть, что stringifyPrimitive не обрабатывает массивы, только число, логическое значение и строку.

Как я и предложил в своем комментарии, учитывая, что вы используете запрос POST, лучшей идеей будет использование JSONкодирование для вашей сложной структуры данных.

Или используйте https://github.com/visionmedia/node-querystring, как предложено @ FriendlyDev

5 голосов
/ 02 марта 2015

Не используйте querystring.parse для воссоздания объекта JSON, отправленного в виде строки. Используйте вместо JSON.parse. И используйте JSON.stringify вместо querystring.stringify

Строка запроса полезна при отправке параметра, закодированного в URL-адресе, или при публикации формы. Но нет смысла использовать его, если вы отправляете только один объект JSON со всеми вашими данными.

В вашем сценарии я бы отклонил библиотеку строк запросов и использовал бы библиотеку JSON, которая уже включена. Было бы чище и быстрее.

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

...