Tengo una base de datos MongoDB. Estoy usando Javascript y Node.js (usando Mangoose) para acceder a esta base de datos. Necesito devolver una matriz con el nombre de todas las colecciones en la base de datos. Así que uso un código que sigue.
let connection = mongoose.createConnection(process.env.MONGODB_URI + "/" + dbname); // Wait 10 seconds for Mongoose to establish the connection. await new Promise(r => setTimeout(r, 10000)); return connection.db.collections() .then(stations=>stations.map(stations=>stations.collectionName)) .catch(reason => { console.error("Error : "+reason); return null; });El código anterior funciona correctamente. Ahora, estoy tratando de hacer el mismo proceso de forma asíncrona. Para esto, estoy usando el siguiente código.
async function station_list_all(dbname){ return new Promise((resolve,reject) => { try { let connection = mongoose.createConnection(process.env.MONGODB_URI + "/" + dbname); resolve(connection); }catch(err){ reject(new Error("DB not found!")); } }) .then(connection => connection.db) .then(db => db.collections()) .then(stations=>stations.map(station=>station.collectionName)) .catch(err => { console.error("Error : "+err); return null; }); } Desafortunadamente, en lugar de los nombres de las colecciones, aparece el mensaje: Error : TypeError: Cannot read property 'collections' of undefined.
Creo que db regresa indefinido, pero... ¿No debería esperar el código hasta que db tenga un valor válido?
Prueba con async await:
try { await mongoose.connect('mongo url with db name'); // other process } catch (error) { handleError(error); }O puede conectarse usando la devolución de llamada:
try { mongoose.connect('mongo url with db name').then(()=>{ // other process }); } catch (error) { handleError(error); }De la misma manera, también puedes probar con la promesa. No es necesario usar settimeout.
Para obtener más información, visite: Mongoose Connections