Подтвердить что ты не робот

В чем разница между установкой свойства на 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 будет меньше шансов на конфликты с будущими обновлениями и другими модулями.

4b9b3361

Ответ 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, поэтому мой совет - использовать это.