/ / Globale Eigenschaften in Express & Handlebars - Javascript, node.js, express, handlebars.js

Globale Eigenschaften in Express & Lenker - javascript, node.js, express, lenkel.js

Ich verwende Lenker (mit express3-Lenker)für Vorlagen und Passport für die Authentifizierung in einer NodeJS-App. Alles funktioniert großartig, aber ich fragte mich, ob es eine Möglichkeit gibt, das von Passport erstellte req.user-Objekt global an Handlebars zu übergeben.

So könnte mein Header teilweise so aussehen:

<header>
<h1>My Title</h1>
{{#if user}}
<p>Hello {{user.name}}</p>
{{else}}
<p>Please <a href="/login">Log In</a></p>
{{/if}}
</header>

Wie es aussieht, muss ich das Benutzerobjekt explizit bei jedem Rendern einer Seite übergeben:

app.get("/", function(req, res){
res.render("home", {
page_title: "welcome",
user: req.user
});
});

Dies scheint mir der falsche Weg zu sein, da ich es auf jeder Seite benötige. Kann ich es nicht nur einmal einstellen und alle Seiten darauf zugreifen können?

Ich kann dies nicht tun, wenn ich Lenker instanziiere, da dies davon abhängig ist, dass der Benutzer bei Passport angemeldet ist, was jedoch nicht immer der Fall ist.

Wäre die Erstellung eines globalen "page_options" -Objekts, das Anhängen und Übergeben an jedes Rendering die richtige Lösung ist, oder kann Handlebars / Express damit umgehen?

Antworten:

9 für die Antwort № 1

Ich habe bisher noch nicht persönlich Passport verwendet, aber basierend auf der Passport README und was ich mit anderen Authentifizierungsschemas gemacht habe, sollte dies funktionieren.

Express 3

app.configure(function() {
app.use(passport.initialize());
app.use(passport.session());
app.use(function(req, res, next) {
res.locals.user = req.user; // This is the important line

next();
});
app.use(app.router);
});

Express 4

app.use(passport.initialize());
app.use(passport.session());
app.use(function(req, res, next) {
res.locals.user = req.user; // This is the important line

next();
});

Grundsätzlich kurz vor dem Rendern Ihre app.locals, res.localsund die Einheimischen, die Sie in die Renderfunktion (das zweite Argument) übergeben, werden alle kombiniert und an Ihre View Engine übergeben.