将全局配置变量传递给车把模板的最佳方法是什么?

时间:2015-02-20 00:19:46

标签: javascript node.js express handlebars.js

我有一个带有快速把手的nodejs应用程序,我想为像“主机”这样的东西定义变量。当前正在header.hbs文件中导入的CSS和Javascript的地址,我在特定布局中调用表单。

我创建了一个config.js文件,其中包含我想设置的多个变量,并使用以下方法将其导入app.js:

var config = require('./config.js');

但随后我就输了。例如,我想我是否可以做一些像这样的事情:

 <link href="{{config.csshost}}basev1.css" rel="stylesheet" type="text/css" /> 

任何人都可以提供一些指针,除了每次加载模板时声明这些变量之外我都难过。

2 个答案:

答案 0 :(得分:4)

您可以设置应用本地人:

var app = express()

app.locals = {
     config: config,
     templateVar: 'test'
 }

编辑:

您的路线看起来像这样:

app.get('/', function(req, res) {
  res.render('index', {config: config});
})

这样做,然后更新express中的 app.locals 变量,如下所示:

app.locals = {
   config: config
}

然后,您可以在模板中访问所有 app.local 变量:

{{config}}

//which is really
app.locals['config']

因此,在你配置express的app.js中你会这样做:

var app = express();

app.locals.config = require('./config')

app.get('/', function(req, res) {
  return res.render('index')
})

答案 1 :(得分:2)

(这应该是对上述sctskw's answer的评论,但我没有足够的声誉来做到这一点。)

不是用新对象覆盖app.locals,而是将新属性添加到现有属性中更好,如下所示:

app.locals.config = config;
app.locals.templateVar = 'test';

原因是Express在内部使用app.locals。覆盖它会丢失Express提供的一些有用变量。例如,我们可以使用settings.env来检测视图模板中的当前运行环境,该模板由Express定义为app.locals.settings.env