11

mongodb を使い始めたばかりですが、コレクションで .find() を使用しようとすると問題が発生します。

特定のデータベースを開いて、それに対して操作を実行できる DataAccessObject を作成しました。コードは次のとおりです。

コンストラクター:

var DataAccessObject = function(db_name, host, port){
    this.db = new Db(db_name, new Server(host, port, {auto_reconnect: true}, {}));
    this.db.open(function(){});
}

getCollection関数:

DataAccessObject.prototype.getCollection = function(collection_name, callback) {
    this.db.collection(collection_name, function(error, collection) {
        if(error) callback(error);
        else callback(null, collection);
  });
};

セーブ機能:

DataAccessObject.prototype.save = function(collection_name, data, callback){
    this.getCollection(collection_name, function(error, collection){
        if(error) callback(error);
        else{
            //in case it's just one article and not an array of articles
            if(typeof (data.length) === 'undefined'){
                data = [data];
            }

            //insert to collection
            collection.insert(data, function(){
                callback(null, data);
            });
        }
    });
}

そして、問題があると思われるもの - findAll 関数:

DataAccessObject.prototype.findAll = function(collection_name, callback) {
    this.getCollection(collection_name, function(error, collection) {
      if(error) callback(error)
      else {
        collection.find().toArray(function(error, results){
            if(error) callback(error);
            else callback(null, results);
        });
      }
    });
};

ダオしようとするときはいつでも。findAll(error, callback)コールバックは呼び出されません。問題をコードの次の部分に絞り込みました。

collection.find().toArray(function(error, result){
    //... whatever is in here never gets executed
});

私は他の人がそれをどのように行っているかを見てきました。実際、私はこのチュートリアルに非常に厳密に従っています。colelction.find().toArray() でこの問題を抱えている人は他にいないようで、私の検索では出てきません。

ありがとう、サーン。

4

1 に答える 1

9

コールバックを使用していないため、を作成した直後にリクエストを作成openしようとすると、準備が整いません。findalldao

あなたのコードがこのようなものである場合、それは機能しません。

var dao = new DataAccessObject("my_dbase", "localhost", 27017);

dao.findAll("my_collection",function() {console.log(arguments);});

私はそれをテストしましたが、レコードが見つからず、エラーも発生しません。エラーが発生するはずだと思います。

ただし、コンストラクターにコールバックを与えるように変更すると、機能するはずです。

var DataAccessObject = function(db_name, host, port, callback){
    this.db = new Db(db_name, new Server(host, port, {auto_reconnect: true}, {}));
    this.db.open(callback);
}

そして、コードをこのようにします。

var dao = new DataAccessObject("my_dbase", "localhost", 27017, function() {
    dao.findAll("my_collection",function() {console.log(arguments);});
});
于 2012-08-22T17:34:59.790 に答える