2017-10-01 1 views
0

mongodbコレクション名をパラメーターとして受け取り、CRUDオペレーションの実行に使用できるようにコレクションのインスタンスを返す関数を作成しようとしています。しかし、コレクションのインスタンスを返そうとすると、返り文としてが「未定義」が返され、MongoClient.connect関数の実行が終了する前に実行されます。nodejsを同期して実行する

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

あなたはノードの少なくともバージョン7.10を使用している場合は、非同期機能との約束を使ってこれを実現することができます。あなたはすべての時間を接続する必要はありませんので、あなたが行うことができ、追加

// 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)); 
     }); 
    } 
    }); 
} 
+0

私はnodejsにかなり新しいので、変数を宣言している間に** var **と** let **の違いを教えてください。私はあなたがlet cachedDBを使っているのを見るでしょう。 var cachedDBも使用できますか? –

+0

letはブロックスコープローカル変数(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/let)を定義します。はい、ここでvarを使用できます。 –

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 
}) 
+0

おかげで、私は、フォローアップの質問があります、api呼び出しが行われるたびに接続を開くのはどれくらい理想的ですか?それはデータベースにオーバーヘッドを作成しますか?どうすればこの問題を解決できますか? –

関連する問題