В чем разница между установкой свойства на app.locals и вызовом app.set()?
Я участвую в процессе обучения Express - и думаю о лучшем месте для сохранения данных стиля конфигурации. Доступные параметры доступны либо в app.locals, либо в app.set(settings)... так:
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 будет меньше шансов на конфликты с будущими обновлениями и другими модулями.
Ответы
Ответ 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.set устанавливает атрибуты на app.locals.settings
. Вы можете проверить это, если вы clobber app.locals.settings
в приведенном выше примере с app.locals.settings = {}
, который сделает #{settings.baz}
undefined.
Итак, что вы используете? Если это не параметр приложения на основе ответа (res.set
) или глобальной конфигурации (app.set
), используйте прямую запись в app.locals
.
Ответ 2
Экспресс ссылка api говорит:
По умолчанию Express предоставляет только одну локальную переменную уровня приложения, настройки.
и в любом случае это нормально:
app.locals.title = 'My App';
app.set('title', 'My App');
// use settings.title in a view
Ответ 3
Все свойства 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
Итак, это действительно вопрос предпочтения и независимо от того, устанавливаете ли вы приложения.
Ответ 4
Многие люди действительно используют locals вместо app.set, поэтому мой совет - использовать это.