2013-02-24 23 views
19

Uygulama yöntemlerinde her aramaya render katmanları (res.render'da ikinci seçenek) eklemek için normal katman yazılımı veya başka bir yöntem aracılığıyla mümkün mü?Node.js Express3 - Middleware, tüm render isteklerine render verisi ekleme

Uygulamam kimlik doğrulama için pasaport kullanıyor ve her zaman oluşturulan şablona kullanıcı bilgilerini eklemek için bir ara katman yazılımı istiyorum.

Şu anda tüm res.render çağrılarım benzer görünüyor. Kullanıcı: req.user dosyasını kaldırmak ve bunu bir middleware işlevine eklemek istiyorum.

// Page 1 
res.render("somepage1",{data : "somepage1", user : req.user}); 

// Page 2 
res.render("somepage2",{data : "somepage2", user : req.user}); 
+0

ilgili ?: [her HTTP isteği üzerine kanca Yürütme app.get önce() ve app.post()?] (Http://stackoverflow.com/questions/13106300) – laggingreflex

cevap

27

Ekspres rota işleyicisi tarafından render geçirilen açık halk ile app.locals ve res.locals, bu automatically merges sağlamaz.

app.use(function(req, res, next) { 
    res.locals.user = req.user; 
    next(); 
}); 

Alternatif olarak, render işlevini sıcak yama yapabilirdiniz.

app.use(function(req, res, next) { 
    var render = res.render; 
    res.render = function(view, locals, cb) { 
     if (typeof locals == 'object') locals.user = req.user; 
     render.call(res, view, locals, cb); 
    }; 
    next(); 
}); 
+0

İlk denedim, işe yaramıyor. res.render, bu yöntemin kırıldığı bir nesnenin parçasıdır. –

+0

“render'] aracılığıyla render işleminin içeriğini korumak zorundasınız (https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/call). – josh3736

+0

Anlıyorum, o zaman işe yarayacak. Muhtemelen bunu yapmak için daha doğru bir yol olan yerliler aracılığıyla başka bir yol buldunuz. Teşekkürler! –

9

bunu çözdü: ekstra havai ama nedense size rota işleyicisi dolmadan kullanılamaz bilgi aktarmak gerekirse, bu bir seçenek beri bu önleyeceğini.

Orta katmandaki yerlileri kullanabilirsiniz. Daha sonra, şablonlarda kullanın.

<h1>User Name:{{user.name}}</h1> 

<h1>User Name:{{_locals.user.name}}</h1>

+5

Aslında şablonda '_locals 'kullanmamalısınız. Express [bu iç değişkeni en üst düzey nesneye otomatik olarak birleştirir] (https://github.com/visionmedia/express/blob/3.1.0/lib/application.js#L467-474). – josh3736