【发布时间】:2018-08-31 21:24:05
【问题描述】:
我正在开发一个节点模块。我需要将 mongoose 传递给我的模块以获取三样东西(mongoose.connection、mongoose.connection.db、mongoose. 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 使用 promise 和 mongoose 事件处理程序
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