mohamed arabe
he empezado a aprender node.js
con express
framework, cuando publico un formulario como este:
router.get('/add-product',(req,res,next)=>{
res.send('<form action="/product" method="POST" ><input type="text" name="title" /><button type="submit">Submit</button></form>');
});
router.post('/product',(req,res,next)=>{
console.log(req.body);
res.redirect("https://stackoverflow.com/");
});
Cuando lo hago console.log(req.body)
muestra:
[Object: null prototype] { title: 'product' }
en lugar de solo { title: 'product' }
Me pregunto si esto realmente es un error con express o simplemente una propiedad que se agregó a express recientemente, porque descargué otro proyecto creado el año pasado y usó el mismo enfoque, cuando lo hice. console.log(req.body)
mostró la misma salida.
jonas wilms
Eso es realmente un buen diseño. Los objetos por defecto heredan el Object.prototype
que contiene algunas funciones auxiliares (.toString()
, .valueOf()
). Ahora si usas req.body
y no pasa ningún parámetro a la solicitud HTTP, entonces esperaría req.body
estar vacío Si fuera solo “un objeto normal”, no estaría completamente vacío:
console.info(({ "toString": 5 })['toString']); // 5
console.info(({})['toString']); // [Function: toString]
Hay una manera de crear “objetos vacíos”, es decir, objetos sin propiedades/prototipo, y eso es Object.create(null)
. Está viendo uno de esos objetos en la consola.
Entonces no, este no es un error que deba corregirse, es solo un gran uso de las características de JS.
-
No entendí esta parte aquí: no pasa parámetros a la solicitud HTTP, entonces esperaría que req.body esté vacío. Si solo fuera “un objeto normal”, no sería:
req.body.toString();
. ¿Puedes elaborar?– Un otaku canalla
24 mayo 2019 a las 19:32
-
@AmitDas quiere decir que incluso si
req.body
no tendría propiedades “propias” (p. ej.title
como en el ejemplo anterior) aún heredaría el prototipo de objeto predeterminado y tendría métodos comotoString()
haciéndolo no vacío.– Ákos
11 de marzo de 2020 a las 13:54
-
La respuesta no dice la solución
– Atul
22 de marzo a las 19:58
Prueba esto,
const obj = JSON.parse(JSON.stringify(req.body)); // req.body = [Object: null prototype] { title: 'product' }
console.log(obj); // { title: 'product' }
¡Feliz Codificación..!
-
esto es lo que terminé haciendo para corregir algunas pruebas, pero parece incorrecto
– dcsan
17 de julio de 2020 a las 0:52
-
const groups = {…match.groups} // elimina el objeto nulo para la comparación de prueba
– dcsan
17 de julio de 2020 a las 1:06
-
Gracias. Esto resuelve el problema pero no imprime bastante el JSON.
– Vengatesh Murugasamy
20 ago 2021 a las 18:00
-
Muchas gracias. Es la 1:30 am. Y luchando con tareas muy básicas que se realizan en Javascript. Me dijeron que es rápido y de rápido desarrollo.
– Atul
22 de marzo a las 20:05
Tengo un problema y mi terminal me mostró la siguiente explicación.
body-parser deprecated undefined extended: provide extended option at express
y usé esto
app.use(bodyParser.urlencoded({extended: false}))
o
está ejecutando una versión de Express que es 4.16+, luego escriba solo
app.use(express.urlencoded({extended: true}))
creo que te ayuda
Para obtener más información sobre la opción extendida, lea los documentos o alguien aquí lo ha respondido bien. ¿Qué significa ‘extendido’ en express 4.0?
-
la diferencia entre extended:true y extended:false es el uso de la biblioteca de análisis subyacente. github.com/expressjs/body-parser#bodyparserurlencodedoptions No tiene nada que ver con el problema descrito (que no es un problema).
– zaphod1984
10 de diciembre de 2019 a las 8:08
Puedes usar Object.assign
para solucionar su problema de la siguiente manera:
const obj = Object.assign({},req.body)
console.log(obj)
Inicializa un nuevo objeto con Object.prototype
y asigna todas las propiedades de req.body
lo.
porque el objeto se basa en el objeto nulo. Encontré la mejor manera de eliminar esto, por ejemplo, si necesita una coincidencia exacta para las pruebas, use:
const groups = {...match.groups} // remove null object for test comparison
Yashwanth MI
El siguiente código funcionó para mí.
app.use(express.urlencoded({ extended : true }));
app.use(express.json());
Ahmed Jubayer
solo cambia {extended: false}
a {extended: true}
funciona para versiones más nuevas de body-parser. Está funcionando en la versión ^1.19.0
cambie su analizador de cuerpo codificado de URL extendido a verdadero en lugar de falso y eso lo hará.
– Josué Gisber
13 de enero de 2021 a las 6:09
Maximiliano Schwarzemüller, ¿verdad?
– Abhay Patil
11 de febrero a las 16:13