Передача мангуста в качестве аргумента функции

Я разрабатываю модуль узла. Мне нужно передать мангуст в мой модуль, чтобы извлечь из него три вещи (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);

      // ...
    });
Другие вопросы по тегам