Node.js - отправлять и получать массив как 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' }
   ]
}

3 ответа

Решение

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

https://github.com/ljharb/qs

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам