2017-10-07 4 views
1
MongoClient.connect(dburl, function (err, db) { 
    var collections = []; 
    db.listCollections().toArray(function (err, collInfos) { 
     for (var i = 0; i < collInfos.length; i++) { 
      collections[i] = collInfos[i].name; 
     } 
     console.log(collections); 
    }); 
    console.log(collections); 
}); 

したがって、すべてのデータベースコレクションを文字列の配列にしたいのですが、これは私のコードです。NodeJS MongoDBカーソルtoArrayコールバック関数は親スコープ変数の変更を行いません

問題がtoArrayコールバック内部console.logが適切アレイを出力する一方、toArrayコールバックのconsole.log外側は、[]第一および出力を実行されることをです。

スコープに問題があるようですが、NodeJSとMongoDBの仕組みに精通していません。

答えて

0

コードのこの部分は非同期です:

db.listCollections().toArray(function (err, collInfos) { 
    for (var i = 0; i < collInfos.length; i++) { 
    collections[i] = collInfos[i].name; 
    } 
    console.log(collections); 
}); 

だから、それはあなたが空の配列[]が最初にして、コレクションの人口のリストを参照する理由ですconsole.log(collections)にあなたの2回目の呼び出し、後に実行されます。スコープの問題ではありませんが、同期と非同期の関数呼び出しの順序についての混乱があります。

私があなただったら、私はコールバックパターンを破棄して代わりに約束を使用します。そうすれば、次のようなことができます:

var Promise = require('bluebird'); 
var mongodb = require('mongodb'); 
var MongoClient = mongodb.MongoClient; 
var Collection = mongodb.Collection; 

Promise.promisifyAll(Collection.prototype); 
Promise.promisifyAll(MongoClient); 

var client = MongoClient.connectAsync('mongodb://localhost:27017/test') 
    .then(function(db) { 
     return db.collection("myCollection").findOneAsync({ id: 'someId' }) 
    }) 
    .then(function(item) { 
     // Use `item` 
    }) 
    .catch(function(err) { 
     // An error occurred 
    }); 

これは役に立ちます。

関連する問題