如何将全局配置变量传递给handlebars模板的最佳方法?

4
我有一个使用express-handlebars的Node.js应用程序,我想为一些变量(例如CSS和JavaScript的“host”地址)定义变量,这些变量当前正在从特定布局中调用的header.hbs文件中导入。
我创建了一个config.js文件,其中包含我想设置的许多变量,并使用以下方式将其导入到app.js中:
var config = require('./config.js');

但是我不知道接下来该怎么做。比如说,我在想如果我能够以某种方式实现类似这样的操作:

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

有人可以提供一些指导吗?除了每次加载模板时声明这些变量,我还想不到其他方法。

2个回答

7

您可以设置应用程序的区域设置:

var app = express()

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

编辑:

您的路由将类似于以下内容:

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

这将更新Express中的app.locals变量,使其如下所示:

这样做的目的是更新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')
})

谢谢,但我不确定如何解释上面的内容?你能解释一下这个代码在做什么以及我如何将这些变量注入到布局中吗? - Ross Alxndr
这就是你需要做的。当渲染模板并传递变量时,所有这些操作都只是更新app.locals,然后将其传递到你的模板作用域。 - sctskw
这个很好用。但是对我来说有点困惑。所以只需使用 app.locals.config = require('./config') 就可以在我的 handlebar 模板中访问配置对象(通过 {{ config.property }})。所以只需查看最后一个代码块 ;) - Alexander Taubenkorb

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接