2017-10-07 6 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

코드의이 부분은 비동기 : 당신이 빈 상태 (empty)의 배열을 참조하는 이유

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)에 두 번째 호출 후 실행됩니다 [] 제 컬렉션의 다음 인구 목록입니다. 범위 문제는 아니지만 동기 및 비동기 함수 호출 순서에 대한 혼동입니다.

내가 너라면, 나는 콜백 패턴을 버리고 대신 약속을 사용한다. 그러면 다음과 같이 할 수 있습니다.

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

희망이 있습니다.