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

Недавно я создал приложение node и решил разделить его на модули.

Мне требуются все зависимости, объявление массива, которым манипулируют другие модули во время работы программы, и выполнение приложения в файле app.js (в этом файле больше ничего нет). Это означает, что все модульные файловые функции должны располагаться ниже по цепочке областей видимости и иметь доступ к пакетам и переменным, требуемым в app.js, верно?

Однако методы и переменные пакета, определенные и требуемые в app.js, выдают ошибки как неопределенные. Это означает, что модульные файлы, которые я создаю, не имеют доступа к переменным и пакетам, необходимым в моем файле app.js.

Программа отлично работает в одном большом файле приложения. Код работает нормально, если я объявлю все зависимости и переменные в app.js глобальными. И код будет работать, если мне потребуются пакеты в каждом файле.

...Все эти решения противоречат целям модульных шаблонов кода...

Не могли бы вы направить меня к некоторым ресурсам, чтобы сделать пакеты и переменные доступными во всех модулях приложения узла, не загромождая глобальную область?

Благодарю вас!


person StephenStephen    schedule 30.11.2015    source источник


Ответы (2)


Нет, это неправильно.

Модули инкапсулируются по умолчанию, экспортируя объект с именем.. module.export. Модули не имеют доступа к контексту (или переменным) родительского модуля.

В отличие от таких языков, как PHP, require() не объединяет файлы.

Если вам нужно передать данные, такие как config, db или другой модуль, вам нужно будет передать их модулю. Один простой пример:

// app.js
var config = require('./config');
var db = require('./db').connect(config.DB_CONFIG);

var UsersModel = require('./usersModel')(db);

var someLogger = require('some-logger');
var logger = someLogger.init(config.SOME_OPTION);

Конечно, существует множество различных стилей и моделей.

person apscience    schedule 30.11.2015

Существует довольно много методов, которые вы можете использовать, и эта статья охватывает большинство из них. из них.

Я часто использую вариант шаблона singleton для глобального контекста приложения, такого как экземпляры базы данных или регистраторы, а затем просто require('./provider') в каждый из соответствующих файлов. Все файлы, в которые вам нужен модуль, получат один и тот же экземпляр этого модуля.

Внедрение зависимостей — это шаблон, который я использую в остальное время.

person Brendan Molloy    schedule 30.11.2015