Soy nuevo en Node.js y tengo dificultades para trabajar con el modelo async/await. El problema que tengo es con las llamadas a funciones anidadas que devuelven datos en un método asíncrono/en espera, siempre obtengo 'undefined' . La estructura de mis funciones es así:
const findCustomerOrder = async (id) => { const orders = await Order.find({custoemrId:id}) .then(async (order) => { if(order) { const products = await findProductsByOrderId(order._id) .then(async (result) => { for(const r in result){ console.log("Product ID: ", result._id); } }); } else console.log("order not found"); }); } const findProductsByOrderId = async (id) => { try{ const products = await Products.find({orderId:id}, (error, data) => { if(error) console.log(error); else return data; }); } catch(err){ return 'error!!'; } }Entiendo que si la llamada de nivel superior es asíncrona/en espera, también se deben esperar todas las llamadas anidadas que he intentado hacer.
¿Qué estoy haciendo mal aquí?
Deshágase de todo el then , y también de la devolución de llamada en la consulta DB. Usar solo await . Hará que todo el código sea mucho más fácil de razonar y también debería resolver su problema como parte de la reestructuración.
En el ejemplo a continuación, también agregué un ciclo sobre las órdenes, porque está obteniendo todas las órdenes, como una matriz, pero luego su código se comportaba como si solo tuviera una. También arreglé el bucle de productos.
Sin embargo, la forma en que busca productos no parece ser la correcta de todos modos, vea mi comentario a continuación. No lo arreglé porque no sé cómo se ve la estructura de su base de datos, así que no sé cuál sería la forma correcta.
async function findCustomerOrder (id) { const orders = await Order.find({ customerId: id }) for (const order of orders) { console.log(`Order ID: ${order._id}`) const products = await findProductsByOrderId(order._id) for (const product of products) { console.log(`Product ID: ${product._id}`); } } } async function findProductsByOrderId (id) { // Note: I don't think this is right. It seems to find all // products with the given ID - which will always be one - // and that ID would be the _product_ ID and not the order ID. return await Products.find({ _id: id }) } Respuesta de comentario preventivo: la return await es intencional, y es por eso que .
Debe eliminar el entonces y también la devolución de llamada y puede hacer algo como a continuación
const findCustomerOrder = async(id) => { try { const orders = await Order.find({ custoemrId: id }); if (orders) { let promiseArray = []; orders.forEach(order => { promiseArray.push(findProductsByOrderId(order._id)); }); let results = await Promise.all(promiseArray); return results; } return "order not found"; } catch (err) { throw err; } } const findProductsByOrderId = async(id) => { try { const products = await Products.find({ _id: id }); return products; } catch (err) { throw err; } }