我有以下代码来创建与我的 MongoDB 数据库的连接,并将其存储以供将来使用。
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
// The database will be defined once a connection to between the cluster and mongodb is created
let _database;
const uri = '';
const databaseName = 'db';
const mongoConnect = () => {
MongoClient.connect(uri)
.then((client) => {
_database = client.db(databaseName);
})
.catch((err) => {
console.log(err);
throw err;
});
};
const getDb = () => {
if (_database) {
return _database;
}
throw 'No database found!';
};
module.exports = {
mongoConnect,
getDb
}
我的问题是 _database 在建立连接之前未定义。如果我的网站在定义 _database 之前尝试使用数据库,它将引发错误并崩溃。
我想让代码的其他部分不会崩溃,而是等待 _database 不是未定义的。听起来需要一个等待/异步解决方案,但我无法理解如何在这里实现类似的东西。任何建议都会很棒!
最佳答案
第一种方法:使 mongoConnect 成为一个异步函数,并在执行任何剩余代码之前等待它。
const mongoConnect = async () => {
try {
const client = await MongoClient.connect(uri);
_database = client.db(databaseName);
} catch(e) {
console.log(err);
throw err;
}
};
在代码的开头
await mongoConnect();
//Remaning code here
第二种方法:让 getDb 函数等待直到数据库连接可用
const mongodb = require('mongodb');
const MongoClient = mongodb.MongoClient;
const uri = '';
const databaseName = 'db';
const databasePromise = new Promise((resolve, reject) => {
MongoClient.connect(uri)
.then((client) => {
resolve(client.db(databaseName));
})
.catch((err) => {
reject(err);
});
})
const getDb = async () => {
return await databasePromise;
};
module.exports = {
getDb
}
供您运行和检查第二种方法的示例代码:
const databasePromise = new Promise((resolve) => {
console.log("Connecting to db in 5 seconds...")
setTimeout(() => {
console.log("Done")
resolve("done")
}, 5000)
})
const getDb = async () => {
return await databasePromise;
};
console.time("First_getDb_call")
getDb().then(res => {
console.timeEnd("First_getDb_call")
console.log(res)
console.time("Second_getDb_call")
getDb().then(res => {
console.timeEnd("Second_getDb_call")
console.log(res)
})
})
关于javascript - 如何等待 MongoDB 连接建立后再使用数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72313865/