Можно ли изменить экспресс-сессию на другое хранилище после создания - PullRequest
0 голосов
/ 06 июля 2018

Я использую memcached в качестве резервного хранилища для сеанса ExpressJS - выбирается с помощью параметра конфигурации приложения. Я хотел бы вернуться из memcached в память, если с хостом memcached нельзя связаться. (Это не обязательно производственная стратегия, так как memcached очень надежен - это скорее для случая, когда я забываю загрузить экземпляр Docker в dev, но все же он может быть безопасным в работе.)

Сначала я подумал, что могу «app.use» создать новый экземпляр сеанса и попытаться удалить первый, но я прочитал, что сложно (если возможно) «не использовать» промежуточное ПО Express, т. Е. Заменить промежуточное ПО на месте в цепочке, или вообще повозитесь с цепочкой, как только она будет настроена.

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

Вторая мысль заключалась в том, могу ли я переконфигурировать сам экземпляр Express Session и изменить хранилище после его создания? Я не смог увидеть в документации .

Моя третья идея заключалась в том, чтобы обернуть экспресс-сессию в новый класс "swappable store", но я опасаюсь возможности обернуть весь интерфейс.

Например, в настройках моего приложения:

app.use(services.session.middleware());

// then a lot of other middleware...
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: false}));
app.use(cookieParser());
app.use(express.static(path.join(rootPath, 'public')));
...etc

А в сервисе сеанса, который выбирает и настраивает экземпляр сеанса:

function middleware() {
    // default / Memory Store options
    const opts = {
        resave: false,
        saveUninitialized: false,
        ...etc
        }
    };

    // Install any configured backing store
    if(config.session.storage === "memcached"){
        const MemcachedStore = require('connect-memcached')(session);
        opts.proxy = 'true';
        opts.store = new MemcachedStore({
            hosts: ...,
            secret: ... 

        });
        const errorHandler = (type, details)=> {
            /* HERE I WOULD LIKE TO RE-MAKE THE SESSION USING MEMORY
             * AND DISCARD THE MEMCACHED ONE
             * (THIS HAPPENS AFTER APP BOOT HAS FINISHED)
            */
            console.error( String.format("Memcached {3} with host:{0} details:{1}.", details.server, details.messages.join( '' ), type)); 
        }
        opts.store.client.on('failure', details => errorHandler('failure', details));
        opts.store.client.on('issue', details => errorHandler('issue', details));
    }

    return session(opts);
}

1 Ответ

0 голосов
/ 06 июля 2018

Я думаю, что есть несколько подходов, которые вы можете попробовать для этого. Первый заключается в настройке системы хранения в зависимости от того, какую конфигурацию вы указали при запуске (возможно, через такой модуль, как config или nconf). Во-вторых, нужно запустить быструю проверку при загрузке приложения, чтобы убедиться, что оно может получить доступ к службе memcache, а если оно не может, то возвращается к памяти с ошибкой.

Мне было бы довольно утомительно делать что-либо из этого, так как вы используете docker, и должно быть легко загрузить memcache. Это потому, что вы будете вводить код, который может сработать в производственном процессе, если возникнет какая-то проблема с подключением, и тогда вы можете случайно обслуживать сеансы из памяти, а не что-то вроде memcache, потенциально не осознавая этого.

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

1. Выберите кеш-систему на основе конфига

Это должно быть довольно просто, просто извлеките вашу конфигурацию в некоторый вид менеджера конфигурации / переменных среды (checkout config или nconf). При запуске приложения и подключении промежуточного программного обеспечения сеанса вы можете вытащить все возможные конфигурации, посмотреть, какие существуют, и прикрепить один на основе этого. Это похоже на то, как выглядит if (config.session.storage === 'memcache") в данный момент. Просто используйте запасной вариант, чтобы не настраивать его, и промежуточное ПО экспресс-сессии откроется в памяти. Таким образом, вы можете полностью исключить конфигурацию и просто всегда использовать память для разработки.

2. Запустите тест перед подключением к нужной услуге

В сочетании с вышеизложенным, если предоставлены подробные сведения о memcache, вы можете запустить быстрый тест, пытаясь сохранить что-то в memcache при запуске. Возможно new Date();, чтобы сигнализировать, когда приложение загрузилось? Если это приводит к ошибке, просто не присоединяйте MemcachedStore к опциям экспресс-сессии, и вы можете безопасно уничтожить MemcachedStore.

3. Выдайте ошибку, если не можете подключиться к Memcached

Это еще одна комбинация с # 2. Если вы обнаружите, что конфигурации memcache предоставлены, то я лично проверил бы, можете ли вы связаться с serivce, а если нет, то выдаст ошибку и остановит приложение. Это будет означать, что в процессе разработки вы сразу же знаете эту проблему, а в процессе работы вы также можете запускать автоматические оповещения для себя, основываясь на том факте, что приложение не запустилось.

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

...