Request: Postagem com matriz vazia no formulário remove a propriedade

Criado em 15 ago. 2017  ·  3Comentários  ·  Fonte: request/request

Resumo


Parece que há alguma forma de otimização no formulário ao postar. Isso é ruim para mim, ele remove propriedades do formulário.
Estou tentando enviar um objeto com uma propriedade que contém uma matriz que pode estar vazia.
Cada vez que a matriz está vazia, um MissingPropertyError está sendo retornado, o que está incorreto, pois a matriz vazia realmente mantém o valor em vez de não ter a propriedade.

Exemplo mais simples de reproduzir

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)
})

Comportamento esperado




Eu esperava que o objeto de envio fosse recebido, pois é json válido

$ 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: [] } ] }

Comportamento Atual



Acontece que o objeto recebido não é nada além de um objeto vazio, olhando para o WireChark, o comprimento do conteúdo sendo enviado é 0.

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

adicionar null ao array muda o comportamento:

$ 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: [ '' ] } ] }

no entanto, adicionar undefined nas matrizes não altera o comportamento:

$ 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: {}

Solução possível


Contexto


Seu Ambiente

| software | versão
| ---------------- | -------
| pedido | 2,81,0
| nó | 8.3.0
| npm | 5.1.0
| Sistema operacional | Ubuntu 16.04.2 LTS

stale

Comentários muito úteis

não posso acreditar que nenhuma das pessoas que trabalham neste projeto tenha qualquer contribuição sobre isso. a resposta acima é inválida porque não compreende o caso de uso mencionado. Por que estamos fornecendo uma amostra para "application / json" quando claramente a pergunta é sobre "application / x-www-form-urlencoded". Este é um problema que ainda está acontecendo, mas infelizmente não recebe atenção.

Em meu teste, as matrizes indefinidas e vazias desaparecerão nos resultados e qualquer coisa 'nula' aparecerá na string codificada por url.

um json de:
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
vai render um url com apenas
"?results%5Barr3%5D="

Todos 3 comentários

Portanto, parece que o objeto JSON está sendo convertido em uma string e está sendo definido como o corpo da solicitação antes de ser enviado. Este é o comportamento padrão quando você especifica o atributo 'formulário'. O método que esta biblioteca usa para converter JSON em uma string remove arrays vazios. O que você precisa fazer é, em vez de passar o atributo 'form', passar o atributo 'body' e JSON.stringify seu objeto JSON para convertê-lo em uma string. Por exemplo:

NOTA: VOCÊ PODE TER QUE CONFUSAR COM OS CABEÇALHOS E USAR application / json como o tipo de conteúdo. Não experimentei para ver o que funciona.

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

Este problema foi marcado automaticamente como obsoleto porque não teve atividades recentes. Ele será fechado se nenhuma outra atividade ocorrer. Obrigado por suas contribuições.

não posso acreditar que nenhuma das pessoas que trabalham neste projeto tenha qualquer contribuição sobre isso. a resposta acima é inválida porque não compreende o caso de uso mencionado. Por que estamos fornecendo uma amostra para "application / json" quando claramente a pergunta é sobre "application / x-www-form-urlencoded". Este é um problema que ainda está acontecendo, mas infelizmente não recebe atenção.

Em meu teste, as matrizes indefinidas e vazias desaparecerão nos resultados e qualquer coisa 'nula' aparecerá na string codificada por url.

um json de:
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
vai render um url com apenas
"?results%5Barr3%5D="

Esta página foi útil?
0 / 5 - 0 avaliações