2015-01-18 1 views
1

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

Пример:

app.get('/about', function(req, res) { 
    res.render('about.html'); 
}); 

app.get('/', function(req, res) { 
    res.render('home.html'); 
}); 

В то время как этот пример сокрушающийся, у меня есть такие 30+ маршруты. То, что я хотел бы быть в состоянии сделать что-то вроде этого:

app.get('/about', generic.render('about.html')); 

или иначе как-то передать имя шаблона функции, которая возвращает res.render Возможно ли это в Express? Все мои попытки обойти этот результат в переменных не определены.

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

app.get('/:template', function(req, res) { 
    res.render(req.params.template + '.html'); 
}); 

ответ

8

Вы можете просто сделать простой промежуточный слой, что делает это для вас. Пример:

function simpleRender(file, opts) { 
    opts || (opts = {}); 
    return function(req, res) { 
    res.render(file, opts); 
    }; 
} 

Тогда просто использовать его как:

app.get('/about', simpleRender('about.html')); 

app.get('/', simpleRender('home.html')); 
+0

Это прекрасно работает. Я не думал о возврате общей функции таким образом. Я приму ваш ответ, как только сайт мне позвонит. Большое спасибо! – Brandon

+0

Одна вещь, которую я не совсем понимаю, - это то, как переменные 'req' и' res' в конечном итоге пробиваются к возвращаемой внутренней функции. Не могли бы вы предложить краткое объяснение? – Brandon

+0

Исправьте меня, если я ошибаюсь, но так ли, что наша функция вызывается первым, устанавливая 'template' и' opts' в область видимости, тогда внутренняя функция возвращается обратно в 'app.get()', где 'req 'и' res', и теперь, когда переменная шаблона находится в области видимости, она может быть передана 'res.render()'? – Brandon

Смежные вопросы