在app.locals上设置一个属性和调用app.set()有什么区别?
我正在学习Express – 并且正在考虑保存configuration样式数据的最佳位置。 可用的选项是在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.set,未来的更新和其他模块的冲突的可能性会降低。
哇,所有的答案都是错的,所以让我试一下。 尽pipe别人说app.local的参数是不同的,使用app.set() 。 看,
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 = {}
中的clobber app.locals.settings
,将会使#{settings.baz}
未定义,您可以validation这一点。
那么你使用哪个? 如果它不是基于响应( res.set
)或全局configuration( app.set
)的应用程序设置,请使用直接写入app.locals
。
express API参考说:
默认情况下,快速公开只有一个应用程序级本地variables,设置。
任何一种方式都可以:
app.locals.title = 'My App'; app.set('title', 'My App'); // use settings.title in a view
app.locals
所有属性都可以在模板中使用。 使用app.set
将属性分配给app.locals.settings
,该属性用于全局应用程序设置,并由挂载的应用程序inheritance。 例如:
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
所以这真的是一个优先select的问题,以及你是否正在安装应用程序。
很多人的确使用本地化而不是app.set,所以我的build议是使用它。