在nodejs和express中,settings和locals有什么区别?

3

开始学习node + express,以下内容有何区别:

app.set(key, value)

并且

app.locals({key: value});

我已经阅读了express文档,它指出app.locals会传递给所有渲染的视图,但我也能够在jade视图中访问设置(使用#{settings.someKey})。 既然两者都可以在jade模板中使用,我似乎无法弄清楚两者的区别或不同用法。

1个回答

3
区别在于直接操作app.locals可以为您的模板创建“顶级”变量,而不必使用settings.前缀。 app.set(key, value)app.locals.settings[key] = value相同;前者是配置Express某些部分(如设置view engine)的首选方式。 编辑:小演示以展示它们如何执行相同操作:
var app = require('express')();

app.set('foo', 'bar');
console.log('app.get("foo"):', app.get('foo')); // 'bar'
console.log('app.locals.settings.foo:', app.locals.settings.foo); // 'bar'
app.locals.settings['foo'] = 'another bar';
console.log('2nd app.get("foo"):', app.get('foo')); // 'another bar'

好的,谢谢。你回答的内容有一点让我困惑,当你说“app.set(key, value)与app.locals.settings[key] = value是相同的”时,你是指它们应该指向同一个对象吗?根据我的测试,这两个对象是不同的。我有什么遗漏吗? - Tsef
以上所有的都是有效的,但是“console.log(app.locals.foo);”(不在你的例子中)无法工作。如果我理解正确,使用app.set(k,v)会在app.locals中创建一个设置对象。这个假设是正确的吗?顺便说一句,感谢您的帮助! - Tsef
你的假设是正确的,但我不确定你为什么认为 app.locals.foo 会存在(因为它没有被 app.set() 设置); app.locals 是一个对象,app.locals.settings 也是一个对象,但你可以使用 app.set(KEY, VALUE)来给它“填充”,同时也可以直接使用 app.locals.settings.KEY = VALUE(或 app.locals.settings['KEY'] = VALUE)。 - robertklep
我最初认为它们是两个不同的对象,一个是app.locals对象,另一个是app.settings对象。我没有意识到settings是嵌套在locals中的一个对象。现在我明白了,感谢你澄清这一点。 - Tsef

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