Request: Publicar con una matriz vacía en el formulario elimina la propiedad

Creado en 15 ago. 2017  ·  3Comentarios  ·  Fuente: request/request

Resumen


Parece que hay alguna forma de optimización en el formulario al publicar. Esto es malo para mí, elimina propiedades del formulario.
Estoy tratando de enviar un objeto con una propiedad que contiene una matriz que podría estar vacía.
Cada vez que la matriz está vacía, se devuelve un error MissingPropertyError, que es incorrecto, ya que la matriz vacía en realidad tiene valor sobre no tener la propiedad en absoluto.

El ejemplo más sencillo de reproducir

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

Comportamiento esperado




Esperaba que se recibiera el objeto de envío, ya que es 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: [] } ] }

Comportamiento actual



Resulta que el objeto recibido no es más que un objeto vacío, mirando a wirehark, la longitud del contenido que se envía es 0.

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

agregar nulo a la matriz cambia el comportamiento:

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

sin embargo, agregar undefined en las matrices no cambia el comportamiento:

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

Solución posible


Contexto


Tu entorno

| software | versión
| ---------------- | -------
| solicitud | 2.81.0
| nodo | 8.3.0
| npm | 5.1.0
| Sistema operativo | Ubuntu 16.04.2 LTS

stale

Comentario más útil

No puedo creer que ninguna de las personas que trabajan en este proyecto tenga alguna opinión sobre esto. la respuesta anterior no es válida ya que no comprende el caso de uso mencionado. ¿Por qué proporcionamos una muestra para "application / json" cuando claramente la pregunta es sobre "application / x-www-form-urlencoded"? Este es un problema que sigue ocurriendo, pero lamentablemente no se le presta atención.

En mi prueba, las matrices indefinidas y vacías desaparecerán en los resultados y cualquier cosa 'nula' aparecerá en la cadena codificada en URL.

un json de:
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
producirá una URL con solo
"?results%5Barr3%5D="

Todos 3 comentarios

Entonces, parece que el objeto JSON se convierte en una cadena y se establece como el cuerpo de la solicitud antes de enviarse. Este es el comportamiento predeterminado cuando especifica el atributo 'formulario'. El método que utiliza esta biblioteca para convertir JSON en una cadena elimina las matrices vacías. Lo que debe hacer es en lugar de pasar el atributo 'formulario', pasar el atributo 'cuerpo' y JSON.stringify su objeto JSON para convertirlo en una cadena. Por ejemplo:

NOTA: PUEDE QUE TENGA QUE ENVIARSE CON LOS ENCABEZADOS Y USAR application / json como tipo de contenido. No he experimentado para ver qué funciona.

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

Este problema se ha marcado automáticamente como obsoleto porque no ha tenido actividad reciente. Se cerrará si no se produce más actividad. Gracias por sus aportaciones.

No puedo creer que ninguna de las personas que trabajan en este proyecto tenga alguna opinión sobre esto. la respuesta anterior no es válida ya que no comprende el caso de uso mencionado. ¿Por qué proporcionamos una muestra para "application / json" cuando claramente la pregunta es sobre "application / x-www-form-urlencoded"? Este es un problema que sigue ocurriendo, pero lamentablemente no se le presta atención.

En mi prueba, las matrices indefinidas y vacías desaparecerán en los resultados y cualquier cosa 'nula' aparecerá en la cadena codificada en URL.

un json de:
{ results: { arr1: [], arr2: undefined, arr3: null, foo: { arr4: [] } } }
producirá una URL con solo
"?results%5Barr3%5D="

¿Fue útil esta página
0 / 5 - 0 calificaciones

Temas relacionados

IgorDePaula picture IgorDePaula  ·  3Comentarios

codecowboy picture codecowboy  ·  3Comentarios

mlegenhausen picture mlegenhausen  ·  4Comentarios

keller35 picture keller35  ·  4Comentarios

jdarling picture jdarling  ·  3Comentarios