Zugriff auf Express.js Anforderung oder Sitzung über die Jade-Vorlage
Frage
Ich frage mich, ob es eine einfache Möglichkeit gibt, aus einer Jade-Vorlage heraus auf die Anforderungs- oder Sitzungsvariablen von Express.js zuzugreifen, ohne sie über die normale Antwort weiterzuleiten.
Oder ist dies der einzige Weg?
res.render('/', {
session: req.session
});
Lösung
Sie müssen einen generischen Codetagcode erstellen, damit Express ihn verwenden kann.
app.dynamicHelpers({
session: function (req, res) {
return req.session;
}
});
Dann können Sie in Ihrer Vorlage dynamicHelper
oder was auch immer verwenden.
Hinweis: dynamicHelpers sind in Express 3 veraltet
Andere Tipps
Fügen Sie einfach hinzu
app.use(express.cookieParser());
app.use(express.session({secret: '1234567890QWERTY'}));
app.use(function(req,res,next){
res.locals.session = req.session;
next();
});
Vor
app.use(app.router);
und erhalten Sie Ihre Sitzung in Jade
p #{session}
In Express 3.x wurden dynamicHelpers entfernt, sodass Sie eine Kombination aus Middleware und res.locals
verwenden müssen.Angenommen, wir möchten in einer req.query
-Ansicht auf /signup/new
zugreifen:
localQuery = function(req, res, next) {
res.locals.query = req.query;
next();
};
newSignup = function(req, res) {
res.render('signup/new');
};
app.get('signup/new', localQuery, newSignup);
Für jede Route, die die Middleware localQuery
verwendet, ist res.locals.query
festgelegt.Darauf kann in Ihrer Ansicht dann als query
zugegriffen werden.
Verwenden Sie einfach eine Middleware.
app.use(function (req, res, next) {
var origRender = res.render;
res.render = function (view, locals, callback) {
if ('function' == typeof locals) {
callback = locals;
locals = undefined;
}
if (!locals) {
locals = {};
}
locals.req = req;
origRender.call(res, view, locals, callback);
};
next();
});
Danach können Sie mit "# {req}" in einer Jade-Vorlage darauf verweisen.
Angenommen, Sie haben ein 'Benutzer'-Objekt in' req 'und' Benutzer 'hat eine Methode' isAnonymous '. Wenn Ihr user.isAnonymous () true zurückgibt,
p #{req.user.isAnonymous()}
wird wie folgt gerendert:
<p>true</p>
das hat bei mir funktioniert
app.use(function(req,res,next){
res.locals.user = req.user;
next();
});
im Mops- oder Jadeansichtsbenutzer
#{user.email}
Während es in Javascript immer eine Möglichkeit gibt, dem Gültigkeitsbereich zu entkommen und nach oben zu kriechen, bin ich wirklich wirklich wirklich wirklich wirklich ermutige Sie nachdrücklich, einen anderen Weg zu finden.
Überlegen Sie, was Sie fragen: Kann ich meine Ansicht über die Eingeweide meines Controllers informieren?
Oder was Sie wirklich fragen: Kann ich meine Ansicht über den Mut meiner Laufzeit wissen lassen?
Eine Ansicht soll Daten aufnehmen und in Markups umwandeln.Das ist es.Wenn Sie etwas anderes tun, machen Sie es falsch.Es ist mir egal, wie "einfach" es ist.Das ist der Punkt einer Schnittstelle.Um genau zu definieren, was übergeben wird, und um es einfach zu machen, eine Sache durch eine andere zu ersetzen.
Sie können dies mit einer Renderfunktion lösen, mit der Sie jede Ansicht rendern, die die Sitzungsvariable als lokale Variable benötigt, auf die in der Vorlage zugegriffen werden kann (normalerweise, wenn beispielsweise ein Benutzer angemeldet ist).
Hier ist ein Beispiel für eine Funktion, die Sie jedoch nach Belieben anpassen können:
var renderView = function(res, template, context, session, cb) {
context.session = session;
if(cb){
res.render(template, context, function(error, html){
cb(error, html)
}
} else {
res.render(template, context)
}
}
Dann kann es folgendermaßen verwendet werden:
app.get("/url", function(req, res){
req.session.user_email = user_email;
renderView(res, "template_name", { local_variables: local_variables }, req.session)
});
und in Ihrer Jade-Vorlage können Sie wie folgt auf die Sitzungsvariablen zugreifen:
div.user-email #{session.user_email}