2011-01-28 18 views
5

nodejs içinde ekspres kullanıyorum ve görünümümün kuru kalmasını sağlamaya çalışıyorum. Benim düzeni içinde, aşağıdaki (I kullanıyorum yeşim) gibi bir şeyExpressY render oluşturma düzenini yerel olarak oluşturma

body 
    nav.login 
    -if(currentUser) 
     ="logged in information" 
    -else 
     ="logged out information" 
    !=body 

Sorun işlemek her zaman, şimdi bu gibi görünüyor

res.render('anything.jade',{ 
    locals: { 
    currentUser: req.session.currentUser, 
    /*all of my other locals*/ 
    } 
}); 

olması gerekir olmam var Tüm render çağrılarımdan geçip bunu eklemem gereken bir acı, ve daha sonra düzeni başka herhangi bir yerlisine eklemek zorunda kalırsam aynı şeyi yap.

cevap

9

Bu cevap geç olmakla kuşaklar için biliyor olabilir: eğer Ekspres kullanıyorsunuz, req,res'u bağımsız değişken olarak kullanan, erişilebilir erişilebilir yardım işlevleri olan, sağlanan dinamik yardımcıları kullanmalısınız. Senin durumunda: görünümünüzü demektir

app.dynamicHelpers({ 
    user: function(req, res){ 
    return req.session.currentUser; 
    } 
}); 

şimdi bu benim daha iyi bir yanıt gibi görünüyor #{user}

+0

diyebiliriz; Soruyu ilk sorduğumda yardımcıların ne kadar iyi ifade ettiklerini bilmiyorum, yine de – Ryan

+0

Bu harika bir ipucu. Her render() çağrısına "site" nesnesini iletirdim. Teşekkürler! –

0

Oluşturduğum her yerde yerel kullanıcılara 'currentUser' yazmasını engellemenin bir yolu var mı? En kolay çözüm, bir yerel nesne döndüren bir işlev kullanmak olacaktır.

function(req) { 
    return { 
     currentUser: req.session.currentUser, 
     /*all of my other locals*/ 
    }; 
} 

res.render('anything.jade',{ 
    locals: defaultLocals(req) 
}); 
2

ben aşağıdakileri yaparak sona erdi:

ilk ben

app.use(function(req,res,next){ 
    req.localvars = new Object; 
    next(); 
}); 

sonra bazı yerel değişkenler kurmak, bazı yerel değişkenler

app.use(function(req,res,next){ 
    req.localvars.currentUser = req.session.currentUser; 
    next(); 
}); 

set

Kurduğum kılmak işlevi

function renderer(file){ 
    return function(req,res,next){ 
    res.render(file,{locals:req.localvars}); 
    } 
} 

sonra yönlendirme fonksiyonu için

app.get('/',blah,blah,whatever,setSomeMoreLocalsHere,renderer(index.jade)); 

Orada daha iyi bir şey olabilir ama ben çözdüm en iyi çözüm şimdiye kadar