Ok, więc zbudowałem bloga używając Jekyll i możesz zdefiniować zmienne w pliku, _config.yml
które są dostępne we wszystkich szablonach / układach. Obecnie używam Node.JS / Express z szablonami EJS i lokalnymi ejs (dla częściowych / układów. Chcę zrobić coś podobnego do zmiennych globalnych, takich jak site.title
te, które można znaleźć w, _config.yml
jeśli ktoś zna Jekyll. Mam zmienne takie jak tytuł witryny (zamiast tytułu strony), nazwa autora / firmy, które pozostają takie same na wszystkich moich stronach.
Oto przykład tego, co obecnie robię .:
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
});
};
Chciałbym móc zdefiniować zmienne, takie jak tytuł, opis, autor itp. Mojej witryny, w jednym miejscu i mieć je dostępne w moich układach / szablonach za pośrednictwem EJS bez konieczności przekazywania ich jako opcji do każdego wywołania res.render
. Czy istnieje sposób, aby to zrobić i nadal pozwolić mi przekazywać inne zmienne specyficzne dla każdej strony?
locals
nie jest funkcją, ale obiektem. Aby ustawić nieruchomość:app.locals.site.title = 'Example';
Możesz to zrobić, dodając je do obiektu lokalnego w ogólnym oprogramowaniu pośredniczącym.
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(); });
Lokalne to także funkcja, która rozszerza obiekt lokalny zamiast go nadpisywać. Więc poniższe działa również
res.locals({ siteTitle: "My Website's Title", pageTitle: "The Home Page", author: "Cory Gross", description: "My app's description", });
Pełny przykład
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'));
Dodałem również ogólne oprogramowanie pośredniczące renderowania. W ten sposób nie musisz dodawać res.render do każdej trasy, co oznacza, że masz lepsze możliwości ponownego wykorzystania kodu. Gdy przejdziesz ścieżką oprogramowania pośredniego wielokrotnego użytku, zauważysz, że masz wiele bloków konstrukcyjnych, które ogromnie przyspieszą rozwój.
źródło
globalLocals
funkcjąreq
ires
są do tyłu.res.locals
nie wydaje się już być funkcją.W przypadku Express 4.0 stwierdziłem, że używanie zmiennych poziomu aplikacji działa trochę inaczej, a odpowiedź Cory'ego nie działa dla mnie.
Z dokumentów: http://expressjs.com/en/api.html#app.locals
Odkryłem, że możesz zadeklarować zmienną globalną dla aplikacji w
na przykład
app.locals.baseUrl = "http://www.google.com"
Następnie w swojej aplikacji możesz uzyskać dostęp do tych zmiennych, aw swoim ekspresowym oprogramowaniu pośrednim możesz uzyskać do nich dostęp w obiekcie req jako
na przykład
console.log(req.app.locals.baseUrl) //prints out http://www.google.com
źródło
W swoim app.js musisz dodać coś takiego
global.myvar = 100;
Teraz we wszystkich plikach, które chcesz użyć tej zmiennej, możesz uzyskać do niej dostęp jako
myvar
źródło
global.myvar
wszędzie, i to zadziałało. To było przyjemne i łatwe rozwiązanie dla socket.io, gdzie chcę wysyłać wiadomości od programów obsługi w innych plikach. Włączam obiekt „io”global.myIO
i wszystko działa świetnie.global.cdnURL = "https://cdn.domain.com
ten sposób możesz przejść do widoku, aby załadować statyczną zawartość.Można to zrobić, aktualizując
app.locals
zmienną dla tej aplikacji wapp.js
Ustaw za pomocą następujących
var app = express(); app.locals.appName = "DRC on FHIR";
Uzyskać dostęp
app.listen(3000, function () { console.log('[' + app.locals.appName + '] => app listening on port 3001!'); });
Opracowanie ze zrzutem ekranu z przykładu @RamRovi z niewielkimi poprawkami.
źródło
możesz też użyć „globalnego”
Przykład:
zadeklaruj tak:
app.use(function(req,res,next){ global.site_url = req.headers.host; // hostname = 'localhost:8080' next(); });
Użyj w ten sposób: w dowolnym widoku lub pliku ejs <% console.log (site_url); %>
w plikach js console.log (site_url);
źródło
Z różnymi odpowiedziami zaimplementowałem ten kod, aby użyć zewnętrznego pliku JSON załadowanego w „app.locals”
Parametry
{ "web": { "title" : "Le titre de ma Page", "cssFile" : "20200608_1018.css" } }
Podanie
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;
Strona 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>
Mam nadzieję, że to pomoże
źródło
Aby uniknąć zanieczyszczonego zasięgu globalnego, tworzę skrypt, który mogę umieścić w dowolnym miejscu.
// 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;
W ten sposób utworzysz nową instancję tylko raz i udostępnisz ją wszędzie tam, gdzie znajduje się plik. Nie jestem pewien, czy dzieje się tak, ponieważ zmienna jest buforowana, czy też z powodu wewnętrznego mechanizmu referencyjnego dla aplikacji (który może obejmować buforowanie). Wszelkie komentarze na temat tego, jak węzeł rozwiązuje ten problem, byłyby świetne.
Może również przeczytaj to, aby dowiedzieć się, jak działa Wymaganie: http://fredkschott.com/post/2014/06/require-and-the-module-system/
źródło