在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议是使用它。