我正在尝试编写一个接受mongodb集合名称作为参数的函数,并返回该集合的一个实例,以便它可用于执行CRUD操作。但是当我试图返回集合的实例时,它返回' undefined' ,因为在 MongoClient.connect 函数完成之前执行了return语句执行。
module.exports.dbConnection = function(collectionName)
{
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://127.0.0.1/test";
var collName;
MongoClient.connect(url, function(err, db)
{
var collName = db.collection(collectionName);
console.log(collName)
});
return collName;
}
我能否就如何解决这个问题获得帮助。 感谢
答案 0 :(得分:0)
实现此目的的正确方法是使用回调。接受回调参数,然后在操作完成时将所需信息传递给该函数。
module.exports.dbConnection = function(collectionName, cb)
{
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://127.0.0.1/test";
var collName;
MongoClient.connect(url, function(err, db)
{
var collName = db.collection(collectionName);
cb(collName); // invoke our callback
});
}
你这样使用它:
dbConnection('collName', function (coll) {
console.log(coll);
// do something else with our collection
})
答案 1 :(得分:0)
如果您使用的是至少7.10版的Node,则可以使用异步功能和承诺来完成此操作。
// You can return a promise and resolve the promise once connected
module.exports.dbConnection = function dbConnection(collectionName) {
const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://127.0.0.1/test";
return new Promise((resolve, reject) => {
MongoClient.connect(url, function (err, db) {
if (err) {
return reject(err);
}
resolve(db.collection(collectionName));
});
});
}
// You can then call the function within an async function (Node v7.10 and above)
async function fnThatCallsDbConnection() {
try {
const collName = await dbConnection('someCollection');
} catch(e){
// do something with error
}
}
您可以做的其他事情是缓存数据库连接,这样您就不需要每次都连接 - 这是您可以这样做的方式:
let cachedDB;
module.exports.dbConnection = function dbConnection(collectionName) {
const MongoClient = require('mongodb').MongoClient;
const url = "mongodb://127.0.0.1/test";
return new Promise((resolve, reject) => {
if (cachedDB) {
resolve(cachedDB.collection(collectionName));
} else {
MongoClient.connect(url, function (err, db) {
if (err) {
return reject(err);
}
cachedDB = db;
resolve(db.collection(collectionName));
});
}
});
}