Каков наилучший способ передачи общих переменных в отдельные модули в узле.Джей?


Я использую отдельные файлы маршрутизатора в качестве модулей для основного приложения и приложения двиг. Я не могу получить лучший способ передачи переменных(клиентская БД) в маршрутизаторах. Я не хочу его жестко кодировать или передавать с помощью:

module.exports = function(app, db) {

может быть, это лучший способ использовать одноэлементный регистр или использовать глобальную переменную db?

каков ваш опыт работы с дизайн-моделей? Какой путь является лучшим и почему?

4 59

4 ответа:

Я нашел с помощью инъекции зависимости, чтобы передать вещи, чтобы быть лучшим стилем. Это действительно будет выглядеть примерно так, как у вас:

// App.js
module.exports = function App() {
};

// Database.js
module.exports = function Database(configuration) {
};

// Routes.js
module.exports = function Routes(app, database) {
};

// server.js: composition root
var App = require("./App");
var Database = require("./Database");
var Routes = require("./Routes");
var dbConfig = require("./dbconfig.json");

var app = new App();
var database = new Database(dbConfig);
var routes = new Routes(app, database);

// Use routes.

это имеет ряд преимуществ:

  • это заставляет вас разделить вашу систему на компоненты с четкими зависимостями, вместо того, чтобы скрывать зависимости где-то в середине файла, где они вызывают require("databaseSingleton") или еще хуже, global.database.
  • это делает модульное тестирование очень легко: если я хочу проверить Routes в изоляции, я могу ввести его с поддельными app и database params и проверить только код.
  • он помещает все ваши объектно-графовые проводки вместе в одном месте, а именно корень композиции (который в данном случае server.js приложения точка входа). Это дает вам одно место, чтобы посмотреть, как все сочетается в системе.

одно из лучших объяснений этого, что я видел это интервью с Марком Симаном, автор отличной книги инъекция зависимостей в .NET. это относится так же, как и к JavaScript, и особенно к узлу.js:require часто используется в качестве классического сервисного локатора, а не просто модульной системы.

Я предлагаю вам создать файл настроек с экземпляром БД и с другими вещами, которые вам нужно использовать глобально, как "синглтон".

например, у меня есть настройки.js с моим клиентом redis db:

var redis = require('redis');
exports.redis = redis.createClient(6379, '127.0.0.1');

и в других нескольких модулях я включаю его:

var settings = require('./settings');
setting.redis.<...>

много раз, включая его, у меня всегда есть один экземпляр подключения к БД.

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

ответ перечислены некоторые из них. Я также построил проще DI рамки здесь.

EDIT: ниже находится копия формы ответа в случае, если эта страница изменяется


require и the способ управления зависимостями в узел.js и, конечно, это интуитивно и эффективно, но он также имеет свои ограничения.

мой совет-взглянуть на некоторые из контейнеров инъекций зависимостей, доступных сегодня для Node.JS, чтобы иметь представление о том, каковы их плюсы/минусы. Некоторые из них:

просто чтобы назвать a несколько.

Теперь вопрос в том, что вы можете достичь с узлом.JS DI контейнер, по сравнению с простым require?

плюсы:

  • лучшая тестируемость: модули принимают свои зависимости в качестве входных данных
  • инверсия управления: решите, как подключить ваши модули, не касаясь основного кода вашего приложения.
  • настраиваемый алгоритм разрешения модулей: зависимости имеют" виртуальные " идентификаторы, обычно они не привязаны к пути в файловой системе.
  • Лучшая расширяемость: включена IoC и" виртуальными " идентификаторами.
  • другие необычные вещи можно:
    • асинхронной инициализации
    • Управление жизненным циклом модуля
    • расширяемость самого контейнера DI
    • можно легко реализовать абстракции более высокого уровня (например, АОП)

плюсы:

  • отличается от узла.ОАО "опыт": не используя require определенно чувствует, что вы отклоняетесь от узлового образа мышления.
  • связь между зависимостью и ее реализацией не всегда является явной. Зависимость может быть решена во время выполнения и зависит от различных параметров. Код становится более трудным для понимания и отладки
  • медленнее время запуска
  • зрелость (на данный момент): ни одно из текущих решений не является действительно популярные на данный момент, так что не так много учебников, нет экосистемы, не бой испытан.
  • некоторые контейнеры DI не будут хорошо работать с модулями, такими как Browserify и Webpack.

Он полностью устарел, но вы можете использовать global в скрипте:

 global.foo = new Foo();

в другой скрипт :

 foo.bar();

вы также можете использовать уже существующую константу:

 Object.foo = new Foo();

и здесь :

 Object.foo.bar();