Итак, я создал блог, используя 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
. Есть ли способ сделать это и при этом позволить мне передавать другие переменные, специфичные для каждой страницы?
locals
это не функция, а объект. Чтобы установить свойство:app.locals.site.title = 'Example';
Вы можете сделать это, добавив их к объекту 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 к каждому маршруту, что означает более удобное повторное использование кода. Пройдя по пути многоразового промежуточного программного обеспечения, вы заметите, что у вас будет много строительных блоков, которые значительно ускорят разработку.
источник
globalLocals
функции дляreq
иres
являются обратными.res.locals
больше не похоже на функцию.Для Express 4.0 я обнаружил, что использование переменных уровня приложения работает немного иначе, и ответ Кори не сработал для меня.
Из документов: http://expressjs.com/en/api.html#app.locals
Я обнаружил, что вы можете объявить глобальную переменную для приложения в
например
app.locals.baseUrl = "http://www.google.com"
А затем в своем приложении вы можете получить доступ к этим переменным, а в своем промежуточном программном обеспечении вы можете получить к ним доступ в объекте req как
например
console.log(req.app.locals.baseUrl) //prints out http://www.google.com
источник
В вашем app.js вам нужно добавить что-то вроде этого
global.myvar = 100;
Теперь во всех ваших файлах, которые вы хотите использовать эту переменную, вы можете просто получить к ней доступ как
myvar
источник
global.myvar
везде, и это сработало. Это было хорошее простое решение для socket.io, где я хочу отправлять сообщения от обработчиков в других файлах. Я включил свой объект "io",global.myIO
и все отлично работает.global.cdnURL = "https://cdn.domain.com
что вы можете перейти к виду , чтобы загрузить статический conent.Один из способов сделать это, обновив
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 с небольшими улучшениями.
источник
вы также можете использовать "глобальный"
Пример:
объявить так:
app.use(function(req,res,next){ global.site_url = req.headers.host; // hostname = 'localhost:8080' next(); });
Используйте это так: в любых представлениях или файле ejs <% console.log (site_url); %>
в js файлах console.log (site_url);
источник
С разными ответами я реализовал этот код для использования внешнего файла JSON, загруженного в "app.locals"
Параметры
{ "web": { "title" : "Le titre de ma Page", "cssFile" : "20200608_1018.css" } }
заявка
var express = require('express'); var appli = express(); var serveur = require('http').Server(appli); var myParams = require('./include/my_params.json'); var myFonctions = require('./include/my_fonctions.js'); appli.locals = myParams;
Страница EJS
<!DOCTYPE html> <html lang="fr"> <head> <meta charset="UTF-8"> <title><%= web.title %></title> <link rel="stylesheet" type="text/css" href="/css/<%= web.cssFile %>"> </head> </body> </html>
Надеюсь, это поможет
источник
Что я делаю, чтобы избежать загрязненной глобальной области видимости, так это создавать сценарий, который я могу включить куда угодно.
// 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/require-and-the-module-system/
источник