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