【问题标题】:passing mongoose as an argument to a function将猫鼬作为参数传递给函数
【发布时间】:2018-08-31 21:24:05
【问题描述】:

我正在开发一个节点模块。我需要将 mongoose 传递给我的模块以获取三样东西(mongoose.connectionmongoose.connection.dbmongoose. mongo) 退出它。

index.js(myModule - 我开发的模块)

function myModule(mongoose) {
    var db = mongoose.connection;
    var gfs = gridfsLockingStream(mongoose.connection.db, mongoose.mongo);
    this.someFunction = function() {//some code here}
}
module.exports = myModule;

db.js(用户必须像这样使用 myModule)

var mongoose = require('mongoose');
var myModule = require('myModule');

var dbUrl = 'mongodb://localhost:27017/gfsTestDB';
mongoose.connect(dbUrl);

var readyObj = new myModule(mongoose);
module.exports = readyObj; // so that the user can use this everywhere

然后用户可以使用 readyObj 来完成他/她的工作。 我的问题是 myModule 函数中只有 mongoose.connection 可用,我收到此错误(gridfsLockingStreamn 导致错误):

错误:缺少 db 参数

新网格(db,mongo)

我正在使用:

"mongodb": "3.0.4",

"mongoose": "4.11.6",

"gridfs-locking-stream": "1.1.1",

"gridfs-stream": "1.1.1",

一种解决方案(来自@GrégoryNEUT 的想法)(但我认为这不是正确的方法):

index.js没有变化

db.js 使用 promisemongoose 事件处理程序

var mongoose = require('mongoose');
var myModule = require('myModule');

var dbUrl = 'mongodb://localhost:27017/gfsTestDB';
mongoose.connect(dbUrl);


module.exports = new Promise(function (resolve, reject) {

    mongoose.connection.on('connected', function () {
        var readyObj = new myModule(mongoose);
        resolve(readyObj);
    });
});

photoRouter.js(用户的文件之一 - 用户想要使用 readyObj

var readyObj = require('./db').then(function (readyObj) {
    // then the user uses readyObj
}

代码可以改进吗?

【问题讨论】:

  • 我试过你的代码,它在我的系统上运行良好,没有任何错误。
  • @ViKiG 您使用的是相同版本的模块吗?
  • 除了猫鼬 (4.9.x) 其他一切都一样。我安装了你的mongoose,结果还是一样。您的问题中可能缺少某些内容。发布更多代码。
  • 很奇怪!但我已经测试了数百次。你确定你已经连接到你的数据库了吗? (使用 db.on('open' , function(){})
  • 我认为@KasraGH 您已经指出了这一点。 .connect() 是异步的。您应该等待连接打开才能到达mongoose.connection.*

标签: node.js mongodb mongoose gridfs gridfs-stream


【解决方案1】:

mongoose connect的文档


你可以使用 Promises。

    var mongoose = require('mongoose');
    var myModule = require('myModule');

    var dbUrl = 'mongodb://localhost:27017/gfsTestDB';

    mongoose.connect(dbUrl)
      .then(
        // The connection is ready to use!
        () => {
          var readyObj = new myModule(mongoose);

          // ...
        },

        // Handle the connection error
        (err) => {
          // ...
        },
      );

你可以使用回调

    var mongoose = require('mongoose');
    var myModule = require('myModule');

    var dbUrl = 'mongodb://localhost:27017/gfsTestDB';

    mongoose.connect(dbUrl, (err) => {
      if (err) {
        // Handle the error

        // ...

        return;
      }

      // We get successfully connected to the database

      var readyObj = new myModule(mongoose);

      // ...
    });

【讨论】:

  • 完美,但还有一件事。我想像这样导出 readObjmodule.exports = readyObj 。我怎样才能做到这一点? readyObj 现在是一个局部变量,不能在 mongoose 成功回调函数之外访问。
猜你喜欢
  • 2013-02-04
  • 2019-04-06
  • 2013-01-27
  • 2014-10-17
  • 2021-04-13
  • 1970-01-01
  • 2021-01-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多