Estoy tratando de crear un botón Agregar al carrito que obtenga los datos de la base de datos del producto utilizando la identificación del producto específico que seleccioné. Estoy tratando de empujar el objeto encontrado usando la misma identificación en una matriz de JavaScript normal y luego mostrarlo usando métodos ejs. Mientras estaba tring, descubrí que no puedo enviar los datos en forma de objeto.
Resumen:
En la séptima línea, declaré una matriz y en esa matriz quiero almacenar algunos objetos que obtuve de un modelo de base de datos. En la línea 15, estoy tratando de insertar el formulario del objeto en mi matriz para poder iterar a través de los objetos para mostrarlos en mi página usando ejs. Pero soy incapaz de hacer eso.
capturas de pantalla:
Código:
app.get("/cart", (req, res) => { if (req.isAuthenticated()) { const findcartdata = req.user.username; userData.findOne({email: findcartdata}, (err, BookId) => { // console.log(BookId.cartItemId); const idArray = BookId.cartItemId; var bookArray = []; idArray.forEach((data) => { productData.findOne({_id: data}, (err, foundBookData) =>{ // console.log(foundBookData); if(err){ console.log(err); } else{ bookArray.push(foundBookData); } }) }); console.log(bookArray); // res.render("cart", { // cartBookArray: BookId.cartItemId // }) }); } else { res.redirect("/login"); } })En el código anterior, encontré el correo electrónico del usuario usando el método de usuario de autenticación de pasaporte y usando ese correo electrónico, quería agregar los productos en una matriz de JavaScript diferente (que voy a pasar a mi archivo ejs del carrito y luego repetirlo en la lista) usando esos matriz de Id que obtuve de otro modelo llamado userData. El problema es que puedo encontrar los datos de usuario de cada ID pero no puedo almacenarlos como una matriz de objetos.
Parece un problema de tiempo, su código se completa antes de que la base de datos descargue los objetos y los envíe a su matriz.
Esto debería solucionar su problema:
// ... const idArray = BookId.cartItemId; var bookArray = []; for (const data of idArray) { const foundBookData = await productData.findOne({_id: data}).catch(console.error); if (!foundBookData) continue; bookArray.push(foundBookData); } console.log(bookArray); // ...Por cierto, asegúrese de hacer que toda la función también sea asíncrona, lo que se haría cambiando esta línea:
userData.findOne({email: findcartdata}, async (err, BookId) => { // ...