在应用程序中设置属性的app.locals和调用app.set()之间有什么区别?

22

我正在学习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”命名空间的app.locals,因为我认为使用app.set会更容易与未来更新和其他模块发生冲突。


我已经更新了正确的答案,请评估它:https://dev59.com/xWct5IYBdhLWcg3wsfgZ#20653926 - Evan Carroll
4个回答

17

哇,所有的答案都是错误的,那让我试一下。尽管其他人说过,将变量分配给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 = {}覆盖上述内容,则可以验证这一点,这将使#{settings.baz}未定义。

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


10
抱歉,但我仍然不明白何时使用哪个。你所说的“基于响应(res.set)或全局配置(app.set)设置的应用程序设置”是什么意思? - Domi

4

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

那么这实际上是一个取决于个人偏好以及您是否需要挂载应用程序的问题。

2

Express的API参考文档中写到:

默认情况下,Express只公开一个应用级别的本地变量:settings。

两种方式都可以:

app.locals.title = 'My App';

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

这个答案是错误的,请看我的答案 - Evan Carroll

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接