【问题标题】:Query Callback Not Called When Mongoose Connection Created In Another Function在另一个函数中创建 Mongoose 连接时未调用查询回调
【发布时间】:2014-03-21 12:11:33
【问题描述】:

如下所示,当我在创建和打开猫鼬连接后立即查询时,会触发查询回调并加载文档。

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 函数中创建连接并稍后进行如下所示的查询时,不会调用回调。 initDBexpress 服务器启动之前被调用。

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

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

【问题讨论】:

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


    【解决方案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);
      });
    };
    

    【讨论】:

      猜你喜欢
      • 2014-06-20
      • 2014-03-20
      • 1970-01-01
      • 2020-12-26
      • 2014-11-29
      • 2023-04-06
      • 2018-07-27
      • 2015-09-19
      • 2017-05-15
      相关资源
      最近更新 更多