在app.locals上设置属性和调用app.set()有什么区别?

时间:2012-08-09 14:22:38

标签: javascript node.js express

我正在学习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,与未来更新和其他模块冲突的可能性会更小。

4 个答案:

答案 0 :(得分:12)

哇,所有的答案都是错的,所以让我试一试。尽管其他人说对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破坏上述内容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.settingsvar 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,所以我的建议是使用它。