Ok, ich habe ein Blog mit Jekyll erstellt und Sie können Variablen in einer Datei definieren, auf _config.yml
die in allen Vorlagen / Layouts zugegriffen werden kann. Ich verwende derzeit Node.JS / Express mit EJS- Vorlagen und EJS-Locals (für Partials / Layouts. Ich möchte etwas Ähnliches tun wie die globalen Variablen site.title
, die in enthalten sind, _config.yml
wenn jemand mit Jekyll vertraut ist. Ich habe Variablen wie die Titel der Site (anstelle des Seitentitels), Autor / Firmenname, die auf allen meinen Seiten gleich bleiben.
Hier ist ein Beispiel dafür, was ich gerade mache:
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
});
};
Ich möchte in der Lage sein, Variablen wie Titel, Beschreibung, Autor usw. meiner Site an einem Ort zu definieren und sie über EJS in meinen Layouts / Vorlagen zugänglich zu machen, ohne sie als Optionen an jeden Aufruf von übergeben zu müssen res.render
. Gibt es eine Möglichkeit, dies zu tun und mir trotzdem zu erlauben, andere für jede Seite spezifische Variablen zu übergeben?
locals
ist keine Funktion, sondern ein Objekt. So legen Sie eine Eigenschaft fest:app.locals.site.title = 'Example';
Sie können dies tun, indem Sie sie dem lokalen Objekt in einer allgemeinen Middleware hinzufügen.
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 ist auch eine Funktion, die das lokale Objekt erweitert, anstatt es zu überschreiben. Das Folgende funktioniert also auch
res.locals({ siteTitle: "My Website's Title", pageTitle: "The Home Page", author: "Cory Gross", description: "My app's description", });
Vollständiges Beispiel
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'));
Ich habe auch eine generische Render-Middleware hinzugefügt. Auf diese Weise müssen Sie nicht jeder Route res.render hinzufügen, was bedeutet, dass Sie den Code besser wiederverwenden können. Sobald Sie die wiederverwendbare Middleware-Route eingeschlagen haben, werden Sie feststellen, dass Sie viele Bausteine haben, die die Entwicklung enorm beschleunigen.
quelle
globalLocals
Funktion fürreq
undres
sind rückwärts.res.locals
scheint keine Funktion mehr zu sein.Für Express 4.0 stellte ich fest, dass die Verwendung von Variablen auf Anwendungsebene etwas anders funktioniert und Corys Antwort bei mir nicht funktioniert hat.
Aus den Dokumenten: http://expressjs.com/en/api.html#app.locals
Ich habe festgestellt, dass Sie eine globale Variable für die App in deklarieren können
z.B
app.locals.baseUrl = "http://www.google.com"
Und dann können Sie in Ihrer Anwendung auf diese Variablen zugreifen und in Ihrer Express-Middleware können Sie im req-Objekt als auf sie zugreifen
z.B
console.log(req.app.locals.baseUrl) //prints out http://www.google.com
quelle
In Ihrer app.js müssen Sie so etwas hinzufügen
global.myvar = 100;
Jetzt können Sie in all Ihren Dateien, in denen Sie diese Variable verwenden möchten, einfach als darauf zugreifen
myvar
quelle
global.myvar
überall darauf verweisen , und das hat funktioniert. Dies war eine schöne einfache Lösung für socket.io, wo ich Nachrichten von Handlern in anderen Dateien ausgeben möchte. Ich lege mein "io" Objekt anglobal.myIO
und alles funktioniert super.global.cdnURL = "https://cdn.domain.com
diese Weise können Sie zu einer Ansicht übergehen, um statische Inhalte zu laden.Eine Möglichkeit, dies zu tun, besteht darin, die
app.locals
Variable für diese App in zu aktualisierenapp.js
Stellen Sie Folgendes ein
var app = express(); app.locals.appName = "DRC on FHIR";
Zugang erhalten
app.listen(3000, function () { console.log('[' + app.locals.appName + '] => app listening on port 3001!'); });
Ausarbeitung eines Screenshots aus dem @ RamRovi-Beispiel mit geringfügiger Verbesserung.
quelle
Sie können auch "global" verwenden
Beispiel:
deklarieren Sie wie folgt:
app.use(function(req,res,next){ global.site_url = req.headers.host; // hostname = 'localhost:8080' next(); });
Verwendung wie folgt: in beliebigen Ansichten oder EJS-Dateien <% console.log (site_url); %>
in js-Dateien console.log (site_url);
quelle
Mit den unterschiedlichen Antworten habe ich diesen Code implementiert, um eine externe Datei JSON zu verwenden, die in "app.locals" geladen ist.
Parameter
{ "web": { "title" : "Le titre de ma Page", "cssFile" : "20200608_1018.css" } }
Anwendung
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 Seite
<!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>
Ich hoffe, es wird helfen
quelle
Um einen verschmutzten globalen Bereich zu vermeiden, erstelle ich ein Skript, das ich überall einfügen kann.
// 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;
Dadurch wird nur einmal eine neue Instanz erstellt und diese überall dort freigegeben, wo die Datei enthalten ist. Ich bin nicht sicher, ob dies daran liegt, dass die Variable zwischengespeichert ist oder an einem internen Referenzmechanismus für die Anwendung (der möglicherweise das Zwischenspeichern umfasst). Alle Kommentare dazu, wie der Knoten dies löst, wären großartig.
Vielleicht lesen Sie auch dies, um zu erfahren, wie die Anforderungen funktionieren: http://fredkschott.com/post/2014/06/require-and-the-module-system/
quelle