Express js передача данных по все маршруты get

Возник вопрос, как правильно во все маршруты передавать одинаковые данные, чтобы не прописывать что-то вроде:

router.route('/home')
    .get((req, res) => res.render('home', {toast: res.flash('toast')}))
router.route('/email')
    .get((req, res) => res.render('email', {toast: res.flash('toast')}))
router.route('/contact')
    .get((req, res) => res.render('contact', {toast: res.flash('toast')}))

Я так понимаю это на уровне middleware правильно реализовать, но как? Задача минимум во все маршруты передавать, задача максимум только в get запросы


Ответы (2 шт):

Автор решения: ksa

как правильно во все маршруты передавать одинаковые данные

Задача минимум во все маршруты передавать, задача максимум только в get запросы

Например так...

app.use((req, res, next) => {
    if (req.method === 'GET') {
        req.mydata = {toast: res.flash('toast')}
    }
    next()
})
app.get('/api/test', function(req, res){
    console.log(req.mydata)
    // тут нужная обработка
)
});
→ Ссылка
Автор решения: Богдан Новотарский

Да, тут лучше всего использовать middleware. Вместо того, чтобы дублировать код во всех маршрутах, создай один middleware, который будет добавлять нужные данные.

Вот как это можно сделать:

   // Это middleware для передачи toast сообщений во все маршруты
   app.use((req, res, next) => {
       // Сохраняем оригинальный метод render
       const originalRender = res.render;
       
       // Переопределяем метод render
       res.render = function(view, options, callback) {
           // Если options не передали, создаем пустой объект
           options = options || {};
           
           // Добавляем toast ко всем параметрам рендеринга
           options.toast = res.flash('toast');
           
           // Вызываем оригинальный метод render с обновленными options
           originalRender.call(this, view, options, callback);
       };
       
       next();
   });

После этого твои маршруты станут чище:

   router.route('/home').get((req, res) => res.render('home'));
   router.route('/email').get((req, res) => res.render('email'));
   router.route('/contact').get((req, res) => res.render('contact'));

Если нужно только для GET запросов, используй app.use с проверкой метода:

   app.use((req, res, next) => {
       if (req.method === 'GET') {
           // Тот же код что и выше, но только для GET
           const originalRender = res.render;
           res.render = function(view, options, callback) {
               options = options || {};
               options.toast = res.flash('toast');
               originalRender.call(this, view, options, callback);
           };
       }
       next();
   });
→ Ссылка