Node.js mongodb - collection.find(). toArray (обратный вызов) - вызов не вызван

Я только начинаю с 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 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);
        });
      }
    });
};

Всякий раз, когда я пытаюсь выполнить dao. findAll (ошибка, обратный вызов), вызов никогда не будет вызван. Я сузил проблему до следующей части кода:

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

Я посмотрел, как это делают другие люди. Фактически, я очень внимательно слежу за этим руководством. Кажется, что у кого-то еще нет этой проблемы с colelction.find(). ToArray(), и она не появляется в моих поисках.

Спасибо, Xaan.

Ответ 1

Вы не используете обратный вызов open, поэтому, если вы пытаетесь сделать запрос findall сразу после создания dao, тогда он не будет готов.

Если ваш код похож на этот, он не будет работать.

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