Недавно я обнаружил, что мне нужно сделать то же самое, чтобы предоставить для каждого из моих шаблонов идентификатор свойства Google Analytics и домен cookie.
Здесь есть множество отличных решений.
Я решил пойти с чем-то очень близким к решению, предложенному Lex, но столкнулся с проблемами, когда вызовы res.render () уже не включали существующие опции. Например, следующий код вызывал исключение в вызове extension (), потому что параметры были не определены:
return res.render('admin/refreshes');
Я добавил следующее, которое объясняет различные возможные комбинации аргументов, включая обратный вызов. Аналогичный подход можно использовать с решениями, предложенными другими.
app.use(function(req, res, next) {
var _render = res.render;
res.render = function(view, options, callback) {
if (typeof options === 'function') {
callback = options;
options = {};
} else if (!options) {
options = {};
}
extend(options, {
gaPropertyID: config.googleAnalytics.propertyID,
gaCookieDomain: config.googleAnalytics.cookieDomain
});
_render.call(this, view, options, callback);
}
next();
});
edit: Оказывается, что, хотя все это может быть удобно, когда мне нужно на самом деле запустить какой-то код, есть чрезвычайно простой способ выполнить то, что я пытался сделать. Я снова посмотрел на исходный код и документы для Express, и оказалось, что app.locals используются для рендеринга каждого шаблона. Поэтому в моем случае я в конечном итоге заменил весь приведенный выше код промежуточного программного обеспечения следующими назначениями:
app.locals.gaPropertyID = config.googleAnalytics.propertyID;
app.locals.gaCookieDomain = config.googleAnalytics.cookieDomain;