Похоже, что при публикации есть какая-то форма оптимизации. Для меня это плохо, убирает свойства из формы.
Я пытаюсь отправить объект со свойством, содержащим массив, который может быть пустым.
Каждый раз, когда массив пуст, возвращается ошибка 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
Итак, похоже, что объект 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="
Самый полезный комментарий
не могу поверить, что никто из людей, работающих над этим проектом, не имеет никакого отношения к этому. ответ выше недействителен, так как он не понимает упомянутый вариант использования. Почему мы предоставляем образец для «application / json», когда явно вопрос касается «application / x-www-form-urlencoded». Эта проблема все еще возникает, но, к сожалению, ей не уделяется внимания.
В моем тесте неопределенные и пустые массивы исчезнут в результатах, и все, что «null» появится в строке с кодировкой url.
json из:
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
даст URL только с
"?results%5Barr3%5D="