Configuré una función para que mi punto final Express JS 'espere' para obtener un resultado de Mongo DB usando Mongo JS.
Función:-
async function getIntroducer(company){ const intro = await dbIntro.collection('introducers').findOne({company: company}, function(err, doc) { console.log("🚀 ~ file: app.js ~ line 289 ~ intro ~ doc.introducer", doc.introducer) return doc.introducer }); return intro //return intro; };Expresar punto final JS: -
app.post( "/case", passport.authenticate("accessToken", { session: false }), async function (req, res) { const body = req?.body; const intro = await getIntroducer(req.user.company); console.log("🚀 ~ file: app.js ~ line 1152 ~ intro", intro)Comportamiento actual, :-
🚀 ~ file: app.js ~ line 1152 ~ intro undefinedLuego se envía el resultado, luego obtengo esto en la consola (es decir, no está esperando): -
🚀 ~ file: app.js ~ line 289 ~ intro ~ doc.introducer 347501También intenté deshacerme por completo de 'const intro' y simplemente devolverlo. Y también intenté deshacerme de la función de devolución de llamada, pero MongoJS dice 'CB no es una función'
¿Alguna ayuda por favor?
Está mezclando diferentes estilos de implementaciones asincrónicas (devolución de llamada y promesa) al consultar la colección.
Al ver que la biblioteca mongojs solo admite el estilo de devolución de llamada. Debe prometer la operación findOne para esperarla.
Existe la biblioteca promisify en el módulo util que puede ayudar en este objetivo en la medida en que la firma de devolución de llamada es una función que se llama con un error y/o un resultado.
Por ejemplo, para prometer el findOne para que pueda esperarse, puede escribir
const util = require('util'); async function getIntroducer(company){ const findOneDbIntro = util.promisify(dbIntro.collection('introducers').findOne); let intro; try { intro = await findOneDbIntro({company: company}); } catch (err) { // log error with your logging library. } //... } Esto da un resultado similar a hacerlo a mano. El objeto Promise está bien documentado en MDN :
async function getIntroducer(company){ let intro; try { intro = await new Promise( (resolve, reject) => { dbIntro.collection('introducers').findOne({company: company}, function (err, doc) { if(err) { reject(err); } resolve(doc); }); }); } catch (err) { // log error with your logging library. } //... }