Задать вопрос
k12th
@k12th
console.log(`You're pulling my leg, right?`);

Приложение на expressjs и глобальные данные?

Насколько правильно хранить глобальные данные в middleware?



Есть небольшое приложение на expressjs. Есть некоторые данные, которые отображаются на всех страницах и дергать их каждый раз из БД неохота (лишний запрос, лишний асинхронный вызов в коде). Их вполне можно читать из БД раз в полчаса. Поэтому я написал middleware, которое ходит в БД по раписанию, а при каждом запросе кладет имеющиеся данные в объект req:

app.use(function (req, res, next) { <br>
    req.cities = myMiddleware.cities; <br>
    next();<br>
})




В общем-то, все работает, как я и ожидал, но есть смутные сомнения в «православности» такого подхода.

Кто как реализовывал такие вещи?
  • Вопрос задан
  • 3588 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 1
pomeo
@pomeo
оно у них так и рекомендуется делать
github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x
(use middleware + res.locals)
пример
  app.use(require('connect-flash')());
  // Expose the flash function to the view layer
  app.use(function(req, res, next) {
    res.locals.flash = function() { return req.flash() };
    next();
  })
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Да все нормально, но я бы не внедрял в req и сделал функцию для запроса.
Если приложение вообще одностраничное, то просто использовал бы переменную.
Ответ написан
Keenest
@Keenest
Я делал так:
var cacheDB; // обновляется из БД раз в полчаса (либо при событии-изменении данных) 

mw = function (req, res, next) { // прослойка, добавляющая кэш БД к реквесту
    req.session.dataDB = cacheDB;
    next();
};

app.get('/', mw, function (req, res) { // добавляем mw сюда
    // рендерим страницу / обрабатываем данные в зависимости от реквеста
});

// и так далее
app.get('/about', mw, function (req, res) {
    // ..
});
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы