javascript - 如何等待 MongoDB 连接建立后再使用数据库

标签 javascript mongodb async-await

我有以下代码来创建与我的 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/

相关文章:

javascript - 在没有 jQuery 的情况下使用顺序选项值填充 knockout 中的下拉列表

javascript - 页面加载后 Bootstrap 总是改变元素在手机上的绝对位置

javascript - chrome.tabs.captureVisibleTab 在 chrome.tabs.update 之后作为同步回调失败?

javascript - Mongoose 文档可以根据特定标准自动删除吗?

python - 取消 python asyncio 中的嵌套协程

javascript - 延迟执行 ES6 模板文字

mongodb - 使用自定义 _id 值时 mongodb 中的 Upserts

mongodb - 使用 update() 获取受影响文档的 ID

javascript - 如何使用 async/await 构造 try/catch?

c# - 在 SignalR 2.0 OnReceived 处理程序中调用 await 的正确方法