我正在学习Express - 并且正在考虑保存配置样式数据的最佳位置。可用选项在app.locals或app.set(设置)中......所以:
app.locals({ config: {
name: 'My App',
domain: 'myapp.com',
viewPath: __dirname+'/views',
viewEngine: 'jade'
port: 3000
} });
app.set('view engine', app.locals.config.viewEngine || 'jade');
这也允许我在我的观点中使用以下内容:
<title>#{config.name}</title> // <title>My App</title>
或者替代方法是像这样使用app.set:
app.set('name', 'My App');
app.set('domain', 'myapp.com');
...然后在视图中使用它:
<title>#{settings.name}</title>
我知道这两种方法都有效,但我很难确定哪种方法更好用。目前我倾向于使用app.locals,使用额外的'app'命名空间,因为我认为如果使用app.set,与未来更新和其他模块冲突的可能性会更小。
答案 0 :(得分:12)
app.js
app.locals.foo = 'bar';
app.set('baz', 'quz');
index.jade
block content
dl
dt app.locals.foo = 'bar';
dd \#{settings.foo} = #{settings.foo}
dd \#{foo} = #{foo}
dt app.set('baz', 'quz')
dd \#{settings.baz} = #{settings.baz}
dd \#{baz} = #{baz}
如果您运行此代码,您会看到,
app.locals.foo = 'bar';
#{settings.foo} =
#{foo} = bar
app.set('baz', 'quz')
#{settings.baz} = quz
#{baz} =
原因是设置视图用作其环境的对象的app.locals
个设置属性;视图将在没有资格的情况下阅读。相反,app.set会在app.locals.settings
上设置属性。如果您使用app.locals.settings
破坏上述内容app.locals.settings = {}
,则可以验证这一点,这将使#{settings.baz}
未定义。
那你用哪个?如果它不是基于回复(res.set
)或全局配置(app.set
)的应用设置,请使用直接写入app.locals
。
答案 1 :(得分:2)
快递api reference说:
默认情况下,Express只公开一个应用级本地变量, 设置。
并且两种方式都可以:
app.locals.title = 'My App';
app.set('title', 'My App');
// use settings.title in a view
答案 2 :(得分:2)
app.locals
的所有属性都可在模板中使用。使用app.set
将属性分配给app.locals.settings
,var app1 = express(),
app2 = express();
app1.set('inheritable', 'foo');
app1.locals.notInheritable = 'bar';
app1.use('/mount', app2);
app2.get('inheritable') === 'foo'; // true
app2.locals.notInheritable === 'bar'; // false
用于全局应用程序设置,并由已挂载的应用程序继承。例如:
{{1}}
因此,这是一个偏好问题以及您是否正在安装应用程序。
答案 3 :(得分:0)
很多人确实使用本地人而不是app.set,所以我的建议是使用它。