2017-10-07 2 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); 
}); 

So möchte ich alle meine Datenbank-Sammlungen in ein Array von Zeichenfolgen und das ist ein Stück meines Codes.NodeJS MongoDB-Cursor toArray Callback-Funktion nimmt keine Änderungen an übergeordneten Bereichsvariablen

Das Problem ist, dass die Außenseite des console.logtoArray Rückruf ersten und Ausgängen ausgeführt wird [], während die im Inneren des console.logtoArray Rückruf richtig das Array ausgibt.

Es scheint mir gibt es eine Art von Problem, aber ich weiß nicht genau, wie NodeJS und MongoDB genau.

Antwort

0

Dieser Teil des Codes ist asynchron: siehe ein leeres Array [] zuerst und dann eine bevölkerten Liste von Sammlungen

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

So wird es nach dem zweiten Anruf console.log(collections), auszuführen, die, warum Sie ist. Es ist kein Problem mit dem Oszilloskop, sondern eine Verwirrung bezüglich der synchronen asynchronen Funktionsaufrufreihenfolge.

Wenn ich Sie wäre, würde ich das Callback-Muster ablegen und stattdessen Versprechungen verwenden. Dann können Sie so etwas tun:

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 
    }); 

Hoffe, das hilft!

Verwandte Themen