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