Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

286
Vistas
No se pueden leer las propiedades de undefined (leyendo 'fitness')

Actualmente estamos creando un sitio web para nuestro proyecto de búsqueda de compañeros de habitación. Estamos en el punto en el que estamos creando la página de resultados, que debería mostrar los 3 compañeros de habitación más compatibles en función de algunas preguntas en las que el algoritmo calcula su porcentaje de compatibilidad.

Ahora estamos tratando de pasar el objeto llamado "fitness" que contiene todos los resultados, que serían:

 let fit = { fitness: Math.round(sum * 100), email: resident[i].email, name: resident[i].firstName + " " + resident[i].lastName, };

A nuestro archivo .ejs llamado results.ejs . El objeto de ajuste se inserta en nuestra variable global de "aptitud".

Esta es nuestra solicitud de publicación:

 router.post("/results", function (request, response) { let item = request.body; let applicant_name = request.body.firstName; client.connect(function (err) { const db = client.db("myFirstDatabase"); assert.equal(null, err); db.collection("residents").insertOne(item, function (err, result) { assert.equal(null, err); console.log("Item inserted"); }); }); client.connect(function (err) { const db = client.db("myFirstDatabase"); assert.equal(null, err); db.collection("residents") .find({}) .toArray(function (err, resident) { if (err) throw err; /* weighting(request); */ compatability(request, resident); }); }); client.close(); response.render("pages/results", { applicant_name: applicant_name, resident: fitness, }); });

En nuestro archivo results.ejs, usamos tarjetas Bootstrap para mostrar los 3 compañeros de cuarto más compatibles. Este es el código que usamos en el archivo results.ejs:

 <p class="card-text"> Compatibility %: <%= resident[0].fitness %><br /> Name: <%= resident[0].name %> <br /> Email: <%= resident[0].email %><br /> Location: <br /> </p>

Cada vez que ejecutamos la solicitud de publicación, recibimos un error que dice "No se pueden leer las propiedades de undefined (leyendo 'fitness')", pero si volvemos a actualizar, el servidor Node.js falla, pero muestra los valores reales que queremos obtener. Si añadimos un "?" después de "residente[0]", ejecuta la página sin errores pero no muestra ninguna información del objeto. Hemos intentado muchas cosas pero no podemos encontrar la solución adecuada para resolver este problema. Gracias por adelantado.

EDITAR

El código completo del archivo .ejs y nuestro código del lado del servidor, con fotos de cómo se ve en el sitio web: https://pastebin.com/zRxdk6aq

about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

El error "Cannot read properties of undefined (reading 'fitness')" en este caso significa que resident[0] no está definido. Esto probablemente se deba al hecho de que resident no está definido o es una matriz vacía (longitud 0).

Desde el código que proporcionó, no puedo ver dónde realmente empuja su objeto a la variable de aptitud global o dónde se define la variable. Quizás ahí esté el problema. Para ayudarlo aún más con eso, sin duda sería útil si pudiera publicar el código para eso.

Editar: mirando el nuevo código que proporcionó en su pastebin, parece que está usando funciones asíncronas pero espera un comportamiento síncrono. Su código actual se ve esencialmente así:

 router.post("/results", function (request, response) { client.connect(function (err) { // Insert data into db }); client.connect(function (err) { // Fetch data from db }); client.close(); response.render("pages/results", { applicant_name: applicant_name, resident: fitness, }); });

El problema con eso es que su programa no espera a que terminen sus operaciones de base de datos antes de mostrar su página. Esto se debe a cómo funcionan las funciones de devolución de llamada.

Supongo que está utilizando el controlador mongoDB para nodejs. Además de las opciones clásicas de devolución de llamada, también permite el uso de async/await :

 router.post("/results", async (request, response) { // await client.connect(); const db = client.db('myFirstDatabase'); await db.collection("residents").insertOne(request.body); let residents = await db.collection("residents").find({}).toArray(); let fitness = compatability(request, resident); client.close(); response.render("pages/results", { applicant_name: request.body.firstName, resident: fitness, }); }); function compatability(request, resident) { let fitness = []; // Do your calculations here return fitness; }

De esta manera, su controlador de solicitudes espera hasta que inserte su nuevo elemento en la base de datos y obtenga los existentes. Solo después de eso, representa su página y, por lo tanto, garantiza que la variable de fitness ya esté llena de datos.

Tenga en cuenta que en este ejemplo también sugiero cambiar su función de compatibilidad para que devuelva su variable `fitness´ en lugar de hacerla global.

Si no está familiarizado con async/await, le recomiendo que también intente aprender sobre Promises .

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda