como arreglar [Object: null prototype] {título: ‘producto’}

4 minutos de lectura

Avatar de usuario de Mohamed Aarab
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.

  • 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

Avatar de usuario de Jonas Wilms
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 como toString() 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?

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

Avatar de usuario de Yashwanth MY
Yashwanth MI

El siguiente código funcionó para mí.

app.use(express.urlencoded({ extended : true }));
app.use(express.json());

Avatar de usuario de Ahmed Jubayer
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

¿Ha sido útil esta solución?