Использование одноэлементного подхода для node.js модули

#node.js #express #module #singleton

#node.js #экспресс #модуль #одноэлементный

Вопрос:

Я использую кэш узлов в своем приложении на основе выражений. Его необходимо настроить с помощью следующего кода;

 const NodeCache = require( "node-cache" );
const myCache = new NodeCache( { stdTTL: 100, checkperiod: 120 } );
  

После этого его можно использовать как

 myCache.get(key)
  

Проблема, с которой я сталкиваюсь, заключается в том, что в экспресс-настройке у меня маршруты являются динамическими, и я не могу получить доступ к константе MyCache, объявленной в index.js Я читал о модулях и понимаю, что они кэшируются, и каждый новый вызов, требующий вызова, получает кэшированную версию.

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

 var nodeCache = require('node-cache');

if (!nodeCache.instance) {
    nodeCache.instance = new nodeCache({ stdTTL: 3600 });
}

nodeCache.instance.get('key');
  

Кажется, это работает хорошо, но я довольно неуверен в этой настройке, если это то, что должно быть сделано, или если есть лучшие альтернативы.

Ответ №1:

Модули CommonJS оцениваются при первом импорте и могут естественным образом предоставлять синглтоны в качестве экспортируемых значений.

cache.js модуль может быть:

 var nodeCache = require('node-cache');

module.exports = new nodeCache({ stdTTL: 3600 });
  

Затем тот же экземпляр кэша узла импортируется из cache.js везде, где это используется.

Комментарии:

1. Он будет создан при первом импорте. Если он импортируется в первый раз в index.js тогда да, он создан там. Дело в том, что require('./cache.js') === require('./cache.js') , таким образом, вы используете один и тот же экземпляр везде.

2. Итак, мне нужно создать дополнительный модуль, который экспортирует «созданный экземпляр» модуля кэша узлов? В моем коде я добавляю экземпляр в сам модуль кэша узлов без необходимости отдельного модуля, разве это не нормально?

3. Да, вам нужно создать отдельный модуль. Добавление instance не в порядке, потому что это хак, который загрязняет другой модуль, вы подключаете модуль кэширования узла вместо того, чтобы создавать свой собственный. Что касается Express, вы можете также хранить значения для всего приложения в таблице настроек, expressjs.com/en/api.html#app.set

4. имеет смысл, пойдет для отдельного модуля. Спасибо!

5. 2 года спустя мне тоже помогло!