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 шт):
как правильно во все маршруты передавать одинаковые данные
Задача минимум во все маршруты передавать, задача максимум только в 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();
});