我最近开始使用node.js + express组合,我偶然发现需要在我的视图中使用dynamicHelpers,而且还需要在我的路由设置中使用(默认快速配置中的routes / index.js)。我应该使用一些不同的模式吗?
app.js
app.dynamicHelpers({
translate : function(req, res) {
return translate;
},
language : function(req, res) {
return req.session.language || "en";
},
});
下面我想方便地访问我为dynamicHelpers设置的内容,因为在我看来它是相同的上下文..那么为什么要设置两次呢?
var routes = {};
routes.index = function(req, res) {
res.render('index', {
title : 'My webpage',
categories : categoryPositions,
referrer : req.header("Referrer"),
languages : ["pl", "en", "de"],
<----- here I would like to use my dynamicHelpers (for example translate)
})
};
我知道我可以通过多种方式传递数据,但我不想重复我的代码 并希望只设置一次公共上下文,并尽可能干净利落地设置公共上下文。我欢迎任何批评和好建议!
答案 0 :(得分:3)
functions.js
module.exports = {
translate : function(req, res) {
return translate;
},
language : function(req, res) {
return req.session.language || "en";
},
};
helpers.js
var functions = require('./functions');
app.dynamicHelpers({
translate : functions.translate,
language : functions.language
});
根据您的需要,您也可以像这样编写帮助
var functions = require('./functions');
app.dynamicHelpers( functions );
routes.js
var functions = require('./functions');
var routes = {
index: function(req, res) {
res.render('index', {
title : 'My webpage',
categories : categoryPositions,
referrer : req.header("Referrer"),
languages : ["pl", "en", "de"],
stuff: functions.translate(req, res) // <----- here I would like to use my dynamicHelpers (for example translate)
})
}
};
答案 1 :(得分:3)
所以实际上解决方案是使用尚未发布的express 3.0,修改:
npm install -g express@3.0
关注https://github.com/visionmedia/express/wiki/Migrating-from-2.x-to-3.x,http://www.devthought.com/code/use-jade-blocks-not-layouts/
新表达的简化dynamicHelpers使用res.locals
,它们在路径设置中都可用,然后绑定到视图。
示例:
// app.
app.locals.use(function(req, res) {
var language = req.session.language || "en";
res.locals.language = language;
res.locals.translate = function(clause) {
return translate(clause, language);
};
});
在路线设置中,我现在可以同时访问res.locals.language
和res.locals.translate
。
在我看来,我只能使用translate('something')
。