Tengo este método asíncrono escrito en Typescript para consultar, con el controlador nodejs, un MongoDB; el compilador indica que "await" antes de "myConnectedClient" no tiene efecto en el tipo de esta expresión ; Estoy confundido: ¿la llamada al agregado () es asíncrona? Entonces, tengo que esperar, ¿o no?
Gracias.
async findQuery<T>( collection: string, findParams: Query<T>, sort: Sort<T>, myConnectedClient: MongoClient ) { const firstResult = await myConnectedClient // the compiler indicates await is useless .db("ZZZ_TEST_ALL") .collection("my_collection_01") .aggregate<string>([{ $project: { _id: 0, name: 1 } }]); firstResult.forEach((field) => { console.log(`Field: ${field}`); }); }ACTUALIZACIÓN: tengo que agregar .toArray() después de la llamada .aggregate(); ¿pero por qué? ¿Alguien me puede explicar el mecanismo? agregado () no tiene devolución de llamada y no devuelve una promesa? ¿Existen alternativas a .toArray()? Gracias.
// now await it's ok const firstResult = await myConnectedClient .db("ZZZ_TEST_ALL") .collection("my_collection_01") .aggregate<string>([{ $project: { _id: 0, name: 1 } }]).toArray();Aggregate está sincronizado y devuelve un AggregationCursor .
El cursor tiene varios métodos asincrónicos para recuperar datos reales: toArray , forEach o simple iterator
En el primer fragmento, firstResult es el cursor, por lo que no es necesario esperar. Utiliza firstResult.forEach para registrar los resultados. Devuelve la promesa, pero la ignora, lo que lo morderá: la promesa devuelta por findQuery se resolverá de inmediato, mientras que forEach iterará los resultados en paralelo. Para mantener la cadena de promesas que debes hacer
const firstResult = myConnectedClient.......; return firstResult.forEach(......); por lo tanto, la promesa devuelta por findQuery se resolverá solo cuando se resuelva forEach, por ejemplo, termine de iterar los resultados.
En el segundo fragmento de "actualización", el primer resultado son los datos, por lo que necesita await para obtenerlo de toArray(). El equivalente con cursor explícito sería:
const cursor = myConnectedClient.......; const firstResult = await cursor.toArray();