#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.set4. имеет смысл, пойдет для отдельного модуля. Спасибо!
5. 2 года спустя мне тоже помогло!