Как создать глобальные переменные, доступные во всех представлениях, используя Express /Node.JS?

Хорошо, поэтому я создал блог с помощью Jekyll , и вы можете определять переменные в файле _config.yml, которые доступны во всех шаблонах /макетах. В настоящее время я использую Node.JS / Express с EJS шаблоны и ejs-locals (для частичных /макетов) Я ищу что-то похожее на глобальные переменные, такие как site.title, которые находятся в _config.yml, если кто-то знаком с Jekyll. У меня есть переменные, такие как название сайта (а не заголовок страницы), имя автора /компании, которые остаются неизменными на всех моих страницах.

Вот пример того, что я сейчас делаю.

exports.index = function(req, res){
    res.render('index', { 
        siteTitle: 'My Website Title',
        pageTitle: 'The Root Splash Page',
        author: 'Cory Gross',
        description: 'My app description',
        indexSpecificData: someData
    });
};

exports.home = function (req, res) {
    res.render('home', {
        siteTitle: 'My Website Title',
        pageTitle: 'The Home Page',
        author: 'Cory Gross',
        description: 'My app description',
        homeSpecificData: someOtherData
    });
};

Я хотел бы иметь возможность определять переменные, такие как заголовок, описание, автор и т. д. моего сайта, в одном месте и делать их доступными в моих макетах /шаблонах через EJS без необходимости передавать их в качестве параметров для каждого вызова res.render. Есть ли способ сделать это и все же разрешить мне передавать другие переменные, специфичные для каждой страницы?

69 голосов | спросил Cory Gross 9 Mayam13 2013, 03:52:05

6 ответов


0

После того, как у вас будет возможность изучить Справочник по Express 3 API a немного больше я обнаружил, что я искал. В частности, записи для app.locals , а затем немного дальше res.locals содержит нужные мне ответы.

Я обнаружил, что функция app.locals принимает объект и сохраняет все его свойства в виде глобальных переменных, ограниченных областью применения. Эти глобальные переменные передаются как локальные переменные каждому представлению. Однако функция res.locals ограничена запросом и, следовательно, локальные переменные ответа доступны только для представлений, представленных во время этого конкретный запрос /ответ.

Так что для моего случая в моем app.js я добавил:

app.locals({
    site: {
        title: 'ExpressBootstrapEJS',
        description: 'A boilerplate for a simple web application with a Node.JS and Express backend, with an EJS template with using Twitter Bootstrap.'
    },
    author: {
        name: 'Cory Gross',
        contact: '[email protected]'
    }
});

Тогда все эти переменные доступны в моих представлениях как site.title, site.description, author.name, author.contact

Я также мог бы определять локальные переменные для каждого ответа на запрос с помощью res.locals или просто передавать переменные, такие как заголовок страницы, в качестве Параметр options в вызове render.

РЕДАКТИРОВАТЬ . Этот метод не позволит вам использовать эти локальные компоненты в вашем промежуточном программном обеспечении. Я действительно столкнулся с этим, как предлагает Пикелс в комментарии ниже. В этом случае вам нужно будет создать функцию промежуточного ПО как таковую в его альтернативном (и ценном) ответе. Ваша промежуточная функция должна будет добавить их в res.locals для каждого ответа, а затем вызвать next. Эта функция промежуточного программного обеспечения должна быть размещена над любым другим промежуточным программным обеспечением, которое должно использовать эти локальные устройства.

РЕДАКТИРОВАТЬ: Еще одно отличие между объявлением местных жителей с помощью app.locals и res.locals заключается в том, что с помощью app.locals переменные устанавливаются один раз и сохраняются в течение всей жизни. приложения. Когда в промежуточном программном обеспечении вы устанавливаете локальные параметры с помощью res.locals, они устанавливаются каждый раз, когда вы получаете запрос. В основном вы должны предпочитать устанавливать глобальные переменные с помощью app.locals, если только значение не зависит от запроса req передана в промежуточное ПО. Если значение не изменяется, то будет более эффективно установить его один раз в app.locals.

ответил Cory Gross 12 Mayam13 2013, 02:14:31
0

Вы можете сделать это, добавив их в объект locals в общем промежуточном программном обеспечении.

app.use(function (req, res, next) {
   res.locals = {
     siteTitle: "My Website's Title",
     pageTitle: "The Home Page",
     author: "Cory Gross",
     description: "My app's description",
   };
   next();
});

Locals - это также функция, которая расширяет объект locals, а не перезаписывает его. Таким образом, следующее работает также

res.locals({
  siteTitle: "My Website's Title",
  pageTitle: "The Home Page",
  author: "Cory Gross",
  description: "My app's description",
});

Полный пример

var app = express();

var middleware = {

    render: function (view) {
        return function (req, res, next) {
            res.render(view);
        }
    },

    globalLocals: function (req, res, next) {
        res.locals({ 
            siteTitle: "My Website's Title",
            pageTitle: "The Root Splash Page",
            author: "Cory Gross",
            description: "My app's description",
        });
        next();
    },

    index: function (req, res, next) {
        res.locals({
            indexSpecificData: someData
        });
        next();
    }

};


app.use(middleware.globalLocals);
app.get('/', middleware.index, middleware.render('home'));
app.get('/products', middleware.products, middleware.render('products'));

Я также добавил универсальное промежуточное программное обеспечение для рендеринга. Таким образом, вам не нужно добавлять res.render к каждому маршруту, что означает, что у вас есть лучшее повторное использование кода. Когда вы пойдете по пути многократного использования промежуточного программного обеспечения, вы заметите, что у вас будет много строительных блоков, которые значительно ускорят разработку.

ответил Pickels 9 Maypm13 2013, 17:47:39
0

В вашем app.js вам нужно добавить что-то вроде этого

global.myvar = 100;

Теперь, во всех ваших файлах, которые вы хотите использовать эту переменную, вы можете просто получить к ней доступ как myvar

ответил Fernando Bustos 21 stEurope/Moscowp30Europe/Moscow09bEurope/MoscowSat, 21 Sep 2013 00:46:02 +0400 2013, 00:46:02
0

Один из способов сделать это - обновить переменную app.locals для этого приложения в app.js

Установить с помощью следующих

var app = express();
app.locals.appName = "DRC on FHIR";

Получить /Доступ

app.listen(3000, function () {
    console.log('[' + app.locals.appName + '] => app listening on port 3001!');
});

Разработка со скриншотом из примера @RamRovi с небольшим улучшением.

 введите описание изображения здесь

ответил Gajen Sunthara 16 J000000Saturday16 2016, 04:15:42
0

вы также можете использовать «глобальный»

Пример:

объявить так:

  app.use(function(req,res,next){
      global.site_url = req.headers.host;   // hostname = 'localhost:8080'
      next();
   });

Используйте вот так:   в любом файле views или ejs      & Lt;%          console.log (site_url);       % >

в js файлах      console.log (site_url);

ответил Shaik Matheen 21 +03002016-10-21T11:02:48+03:00312016bEurope/MoscowFri, 21 Oct 2016 11:02:48 +0300 2016, 11:02:48
0

Что я делаю, чтобы избежать загрязнения глобальной области видимости, - это создание сценария, который я могу включить где угодно.

// my-script.js
const ActionsOverTime = require('@bigteam/node-aot').ActionsOverTime;
const config = require('../../config/config').actionsOverTime;
let aotInstance;

(function () {
  if (!aotInstance) {
    console.log('Create new aot instance');
    aotInstance = ActionsOverTime.createActionOverTimeEmitter(config);
  }
})();

exports = aotInstance;

В этом случае новый экземпляр будет создан только один раз и будет доступен везде, где находится файл. Я не уверен, что это потому, что переменная кэшируется или из-за внутреннего механизма ссылки для приложения (который может включать в себя кэширование). Любые комментарии о том, как узел разрешает это, было бы замечательно.

Может также прочитать это, чтобы понять, как работает require: http://fredkschott.com/post/2014/06 /требуют-и--модуль-система /

ответил dewwwald 26 J000000Wednesday17 2017, 14:46:29

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132