Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

289
Visualizações
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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda