Можно ли передавать аргументы при загрузке модуля с помощью require?
У меня есть модуль login.js, который обеспечивает возможность входа в систему. Для этого требуется соединение с базой данных, и я хочу, чтобы одно и то же соединение с базой данных использовалось во всех моих модулях. Теперь я экспортирую функцию login.setDatabase (...), которая позволяет мне указать соединение с базой данных, и она отлично работает. Но я бы предпочел передать базу данных и любые другие требования при загрузке модуля.
var db = ...
var login = require("./login.js")(db);
Я новичок в NodeJS и обычно разрабатываю с использованием Java и Spring Framework, так что да ... это инъекция конструктора :) Можно ли сделать что-то вроде кода, который я предоставил выше?
app
объект требуемым модулям.Ответы:
Основываясь на ваших комментариях в этом ответе , я делаю то, что вы пытаетесь сделать, вот так:
Я структурирую почти все свои модули таким образом. Кажется, у меня хорошо работает.
источник
app
Необходим ли аргумент, или я могу его пропустить? Мой модуль не будет явно использовать этот аргумент приложения, но я не знаю, требуется ли он node.js для какой-то внутренней вещи. Если все в порядке, мое объявление модуля будет выглядеть так:module.exports = function (db) {
require(mymodule)(myargs)
даст вам модуль для работы. Однако, если вы ссылаетесь на него где-то еще из другого модуля ?? в базовой системе, похоже, задействован кеш, но в этой системе кеш будет возвращать голый метод генератора при последующих вызовахrequire()
, и если вы передадите аргументы,require()(someargs)
вы получите обратно другой модуль ... возможно, мне не хватает somethingvar module;
вне функции экспорта, а затем, как только вы войдете вmodule
нее, вы захотите проверить, определена ли она, и если да, просто верните ее (а если нет, инициализируйте). Имеет ли это смысл?Я не уверен, что это все еще будет полезно для людей, но с ES6 у меня есть способ сделать это, который я считаю чистым и полезным.
И тогда вы получите ожидаемое поведение.
источник
Да. В вашем
login
модуле просто экспортируйте одну функцию, которая принимает вdb
качестве аргумента. Например:источник
module.exports = function(app,db) { ... } module.exports.auth = function(req,res) { ... authentication stuff }
Это сделать вызов функции «анонимной» и устанавливаетapp
иdb
переменные, но, при выполнении этого моего приложения не будет найтиauth
функцию. Что я делаю не так? Если я удалю анонимную функцию,auth
функция снова станет доступной.exports
это объект. Вы можете назначить ему свойства (множественный экспорт) или присвоить ему значение. Похоже, вы назначили экспорт функции, но затем назначили auth как свойство функции, которую вы назначили экспорту. Так что вам нужно будет сделатьvar auth = require("./login.js").auth
то, что вы намеревались не делать. Если вы хотите использовать шаблон из исходного вопроса, вероятно, лучше всего придерживаться одного значения экспорта. Если это все еще не имеет смысла, я бы порекомендовал мне опубликовать суть.auth
в качестве свойстваexports
объекта, а затем в модуле, назначенномexports
функции (таким образом, переопределив предыдущее назначение). Если вы измените порядок назначения, вы сможете получить доступ кauth
функции, как и предполагали. Опять же, трудно сказать, не видя кода.var login = require('login')
и нет разницыvar login = require('login')(app)
, но разница огромная, в возвращаемой анонимной функции нет никакого волшебства, это просто еще одна функция / объект. Вместо того , чтобы иметьmodule.exports.auth
, то anomymous функция теперь возвращает функцию аутентификации (amongs другие), то естьreturn { auth: authFunction, login: loginFunction}
. Итак, теперь это работает. Спасибо.