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.
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)
})
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: [] } ] }
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: {}
| software | versión
| ---------------- | -------
| solicitud | 2.81.0
| nodo | 8.3.0
| npm | 5.1.0
| Sistema operativo | Ubuntu 16.04.2 LTS
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="
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="