Request: Сообщение с пустым массивом в форме удаляет свойство

Созданный на 15 авг. 2017  ·  3Комментарии  ·  Источник: request/request

Резюме


Похоже, что при публикации есть какая-то форма оптимизации. Для меня это плохо, убирает свойства из формы.
Я пытаюсь отправить объект со свойством, содержащим массив, который может быть пустым.
Каждый раз, когда массив пуст, возвращается ошибка MissingPropertyError, что неверно, поскольку пустой массив фактически содержит значение, а не отсутствие свойства.

Самый простой пример для воспроизведения

const request = require( 'request' )
const bodyParser = require('body-parser')
const app = require('express')()

app.use( bodyParser.json() )
app.use( bodyParser.urlencoded( { extended: true } ) )

app.post('/', function( req, res ){
    console.log( 'received:', req.body )
    res.send('ok')
})
app.listen( 53153 )

const req = {
    url: 'http://localhost:53153',
    method: 'POST',
    headers: {
        'Content-Type' : 'application/x-www-form-urlencoded'
    },
    form: {
        emptyArray: [],
        filledArray: [{something:[]}]
    }
}
console.log( 'sending:', req )
request( req , function( err, httpResponse, body ){
    process.exit(0)
})

Ожидаемое поведение




Я ожидал, что объект отправки будет получен, так как это действительный json

$ node index.js
sending: { url: 'http://localhost:53153',
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  form: { emptyArray: [], filledArray: [ { something: [] } ] }
received: { emptyArray: [], filledArray: [ { something: [] } ] }

Текущее поведение



Оказывается, полученный объект - не что иное, как пустой объект, если посмотреть на wirehark, длина отправляемого содержимого равна 0.

$ node index.js
sending: { url: 'http://localhost:53153',
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  form: { emptyArray: [], filledArray: [ { something: [] } ] }
received: {}

добавление null в массив изменяет поведение:

$ node index.js
sending: { url: 'http://localhost:53153',
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  form: { emptyArray: [ null ], filledArray: [ { something: [ null ] } ] }
received: { emptyArray: [ '' ], filledArray: [ { something: [ '' ] } ] }

однако добавление undefined в массивы не меняет поведения:

$ node index.js
sending: { url: 'http://localhost:53153',
  method: 'POST',
  headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  form: { emptyArray: [ undefined ], filledArray: [ { something: [ undefined ] } ] }
received: {}

Возможное решение


Контекст


Ваше окружение

| программное обеспечение | версия
| ---------------- | -------
| запрос | 2,81,0
| узел | 8.3.0
| npm | 5.1.0
| Операционная система | Ubuntu 16.04.2 LTS

Самый полезный комментарий

не могу поверить, что никто из людей, работающих над этим проектом, не имеет никакого отношения к этому. ответ выше недействителен, так как он не понимает упомянутый вариант использования. Почему мы предоставляем образец для «application / json», когда явно вопрос касается «application / x-www-form-urlencoded». Эта проблема все еще возникает, но, к сожалению, ей не уделяется внимания.

В моем тесте неопределенные и пустые массивы исчезнут в результатах, и все, что «null» появится в строке с кодировкой url.

json из:
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
даст URL только с
"?results%5Barr3%5D="

Все 3 Комментарий

Итак, похоже, что объект JSON преобразуется в строку и устанавливается в качестве тела запроса перед отправкой. Это поведение по умолчанию, когда вы указываете атрибут 'form'. Метод, который эта библиотека использует для преобразования JSON в строку, удаляет пустые массивы. Что вам нужно сделать, так это вместо того, чтобы передавать атрибут 'form', передать атрибут 'body' и JSON. Структурировать свой объект JSON, чтобы преобразовать его в строку. Например:

ПРИМЕЧАНИЕ. ВОЗМОЖНО, ВЫ ДОЛЖНЫ ОБРАЩАТЬСЯ С ЗАГОЛОВКАМИ И ИСПОЛЬЗОВАТЬ application / json в качестве типа содержимого. Я не экспериментировал, чтобы увидеть, что работает.

{
    url: 'http://localhost:53153',
    method: 'POST',
    headers: { 'Content-Type': 'application/json'},
    body: JSON.stringify({ emptyArray: [], filledArray: [ { something: [] } ] })
}

Эта проблема была автоматически помечена как устаревшая, поскольку в последнее время не было активности. Он будет закрыт, если больше не будет активности. Спасибо за ваш вклад.

не могу поверить, что никто из людей, работающих над этим проектом, не имеет никакого отношения к этому. ответ выше недействителен, так как он не понимает упомянутый вариант использования. Почему мы предоставляем образец для «application / json», когда явно вопрос касается «application / x-www-form-urlencoded». Эта проблема все еще возникает, но, к сожалению, ей не уделяется внимания.

В моем тесте неопределенные и пустые массивы исчезнут в результатах, и все, что «null» появится в строке с кодировкой url.

json из:
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
даст URL только с
"?results%5Barr3%5D="

Была ли эта страница полезной?
0 / 5 - 0 рейтинги