2014-02-20 1 views
4

Когда я запрашиваю сразу после создания и открытия соединения mongoose, как показано ниже, обратный вызов запроса удаляется, а документы загружаются.Запрос вызова не вызывается, когда соединение Mongoose создано в другой функции

var db, 
    mongoose = require('mongoose'); 

... 

MyClass.prototype.query = function(model, criteria, callback) { 
    var options = { 
    server: { 
     auto_reconnect: true, 
     socketOptions : { 
     keepAlive: 1 
     } 
    } 
    }; 

    mongoose.connect('mongodb://localhost/mydatabase', options); 

    db = mongoose.connection; 

    db.on('error', console.error.bind(console, 'Error:')); 

    db.once('open', function() { 
    model.find(criteria).exec(function(err, docs) { 
     callback(err, {}, docs); 
    }); 
    }); 
}; 

Однако, когда я создаю соединение в initDB функции и сделать запрос позже, как показано ниже, обратный вызов не вызываются. initDB вызывается до запуска сервера express.

var db, 
    mongoose = require('mongoose'); 

... 

function initDB() { 
    var options = { 
    server: { 
     auto_reconnect: true, 
     socketOptions : { 
     keepAlive: 1 
     } 
    } 
    }; 

    mongoose.connect('mongodb://localhost/mydatabase', options); 

    db = mongoose.connection; 

    db.on('error', console.error.bind(console, 'Error:')); 
} 

... 

MyClass.prototype.query = function(model, criteria, callback) { 
    db.once('open', function() { 
    model.find(criteria).exec(function(err, docs) { 
     callback(err, {}, docs); 
    }); 
    }); 
}; 

Что мне здесь не хватает? Любая помощь будет принята с благодарностью!

ответ

2

Это, скорее всего, потому, что обратный вызов, переданный в db.once('open', ..., вызывается только один раз, когда установлено соединение с вашей базой данных. Попробуйте перевести звонок на db.once() в вашу initDB() функцию следующим образом:

var db, 
    mongoose = require('mongoose'); 

... 

function initDB() { 
    var options = { 
    server: { 
     auto_reconnect: true, 
     socketOptions : { 
     keepAlive: 1 
     } 
    } 
    }; 

    mongoose.connect('mongodb://localhost/mydatabase', options); 

    db = mongoose.connection; 

    db.once('open', function() { 
    console.log('Connected to database!'); 
    }); 

    db.on('error', console.error.bind(console, 'Error:')); 
} 

... 

MyClass.prototype.query = function(model, criteria, callback) { 
    model.find(criteria).exec(function(err, docs) { 
    callback(err, {}, docs); 
    }); 
};