2014-02-26 9 views
5

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

So teilweise meine Header wie folgt aussehen könnte:

<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 Ich habe ausdrücklich das Benutzerobjekt zu übergeben mit jeder Seite machen:

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

Dies scheint der falsche Weg um es so zu machen, wie ich es auf jeder Seite benötige, kann ich es nicht einfach einmal einstellen und alle Seiten haben Zugriff darauf?

Ich kann dies nicht tun, wenn ich Lenkstangen instanziiere, da es davon abhängig ist, dass der Benutzer mit Passport angemeldet ist, was nicht immer der Fall sein wird.

Würde ein globales 'page_options' -Objekt erstellt, das Anhängen und Übergeben an jedes Render-Objekt die richtige Lösung wäre oder hätte Handlebars/Express eine Möglichkeit, damit umzugehen?

Antwort

7

Ich habe Passport vorher nicht persönlich verwendet, aber basierend auf der Passport README und was ich mit anderen Authentifizierungsschemata 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 direkt vor dem Rendern, Ihre app.locals, res.locals, und die Einheimischen Sie in die Funktion machen passieren (das zweite Argument) Alle werden kombiniert und an Ihre View Engine weitergegeben.

+0

Großartig! Es war mir nicht in den Sinn gekommen, dass diese Funktionalität in der Express-Konfiguration sein könnte. Danke vielmals. – lewis

+0

Hey ich benutze Express 4.x und dieser Code funktioniert nicht für mich. Ich denke, sie haben app.config() in 4.x entfernt. Irgendeine Idee, wie ich das für Express 4.x umsetzen kann? – codeinprogress

+0

Sie haben recht, 'configure' wurde in Express 4 entfernt! Ich habe den obigen Code aktualisiert (aber nicht getestet), daher sollten Sie ihn vor dem Rest der Routing-Logik verwenden können. – ZachRabbit