Передача аргументов, требующих (при загрузке модуля)

Можно ли передавать аргументы при загрузке модуля с использованием require?

У меня есть модуль login.js, который предоставляет функции входа в систему. Для этого требуется подключение к базе данных, и я хочу, чтобы одно и то же соединение с базой данных использовалось во всех моих модулях. Теперь я экспортирую функцию login.setDatabase(...), которая позволяет мне указать соединение с базой данных, и это работает нормально. Но я бы предпочел передать базу данных и любые другие требования при загрузке модуля.

var db = ...
var login = require("./login.js")(db);

Я новичок в NodeJS и, как правило, разрабатываю с использованием Java и Spring Framework, так что да... это инъекция конструктора:) Возможно ли сделать что-то вроде кода, приведенного выше?

Ответ 1

Основываясь на ваших комментариях в этом ответе, я делаю то, что вы пытаетесь сделать вот так:

module.exports = function (app, db) {
    var module = {};

    module.auth = function (req, res) {
        // This will be available 'outside'.
        // Authy stuff that can be used outside...
    };

    // Other stuff...
    module.pickle = function(cucumber, herbs, vinegar) {
        // This will be available 'outside'.
        // Pickling stuff...
    };

    function jarThemPickles(pickle, jar) {
        // This will be NOT available 'outside'.
        // Pickling stuff...

        return pickleJar;
    };

    return module;
};

Я структурирую практически все мои модули. Кажется, это хорошо работает для меня.

Ответ 2

Да. В вашем модуле login просто экспортируйте единственную функцию, которая принимает db в качестве аргумента. Например:

module.exports = function(db) {
  ...
};

Ответ 3

Я не уверен, что это все равно будет полезно людям, но с ES6 у меня есть способ сделать это, что я считаю чистым и полезным.

class MyClass { 
  constructor ( arg1, arg2, arg3 )
  myFunction1 () {...}
  myFunction2 () {...}
  myFunction3 () {...}
}

module.exports = ( arg1, arg2, arg3 ) => { return new MyClass( arg1,arg2,arg3 ) }

И тогда вы получите ожидаемое поведение.

var MyClass = require('/MyClass.js')( arg1, arg2, arg3 )

Ответ 4

Еще один способ сделать это - сначала определить методы, а затем сделать их доступными ниже через "export". (module.exports и export ссылаются на один и тот же объект)

function kamehameha(name,fame){


}

function bigbangkamehameha(name){

}



exports.kamehameha=kamehameha;
exports.bigbang=bigbangkamehameha; //bigbang refers to bigbangkamehameha