我有以下代碼來創建到我的 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 未定義。聽起來需要等待/異步解決方案,但我無法理解如何在這里實作類似的東西。任何建議都會很棒!
uj5u.com熱心網友回復:
第一種方法:使 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)
})
})
uj5u.com熱心網友回復:
**非常簡單的方法**只需在 MongoClient.connect 函式之前添加 await 并使函式異步現在它將等待連接有回應然后繼續前進。
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 = 'mongodb://localhost:27017/mydb';
const databaseName = 'db';
const mongoConnect = async () => {
await 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
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/478468.html
上一篇:迭代不同長度的陣列并替換值
