【问题标题】:What is the difference between setting a property on app.locals and calling app.set()?在 app.locals 上设置属性和调用 app.set() 有什么区别?
【发布时间】:2012-08-09 14:22:37
【问题描述】:

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

【问题讨论】:

标签: javascript node.js express


【解决方案1】:

哇,所有的答案都是错误的,所以让我试一试。尽管其他人说 使用 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.setapp.locals.settings 上设置属性。如果你在上面用app.locals.settings = {} 破坏app.locals.settings,你可以验证这一点,这将使#{settings.baz} 未定义。

那你用哪个?如果不是基于响应(res.set)或全局配置(app.set)的应用设置,使用直接写入app.locals

【讨论】:

  • 对不起,我还是不明白什么时候用哪个。 “基于响应(res.set)或全局配置(app.set)的应用设置”是什么意思?
【解决方案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

所以这实际上是一个偏好问题,以及您是否正在安装应用程序。

【讨论】:

    【解决方案3】:

    快递api reference 说:

    默认情况下,Express 只公开一个应用级局部变量, 设置。

    无论哪种方式都可以:

    app.locals.title = 'My App';
    
    app.set('title', 'My App');
    // use settings.title in a view
    

    【讨论】:

    【解决方案4】:

    很多人确实使用 locals 而不是 app.set,所以我的建议是使用它。

    【讨论】:

      猜你喜欢
      • 2011-11-14
      • 2017-03-27
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-20
      相关资源
      最近更新 更多