在另一个函数中创建Mongoose连接时不调用查询回调

时间:2014-02-20 13:46:00

标签: javascript node.js mongodb mongoose mongodb-query

当我在创建和打开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);
    });
  });
};

我在这里缺少什么?任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

这很可能是因为传递给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);
  });
};