Передача мангуста в качестве аргумента функции
Я разрабатываю модуль узла. Мне нужно передать мангуст в мой модуль, чтобы извлечь из него три вещи (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 вызывает ошибку):
Ошибка: отсутствует аргумент БД
Новая Сетка (БД, Монго)
Я использую:
"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 использует обработчик обещаний и событий мангуста
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
}
Можно ли улучшить код?
1 ответ
Смотря на документацию mongoose connect
Вы можете использовать обещания.
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);
// ...
});