2015-11-01 56 views
0

我想在Express模板呈現之前(當res.render被調用時)掛鉤到部件中,以便我可以執行諸如從res.res.locals.之間分配適當的東西,使其可用於模板。例如,做res.locals.user = res.user如何創建在res.render(模板呈現)之前運行的Express中間件?

標準的中間件不夠好,因爲它在一切之前運行,所以在這種情況下user將不可用。現在我必須分別在每個路由功能中執行此操作。

res.locals.user = res.user; 
res.render('template.html', context); 

此外,在這一點上的掛鉤將是東西像國際化等有用。

+0

不同意!一箇中間件對此很有幫助,中間件有它們的順序,並不是所有的中間件都運行每個請求,例如:將'express.static''移動到上面將防止較低的中間件運行。 – damphat

+0

您能否舉個例子,'express.static'聽起來很有趣,但我不確定您的意思,謝謝。 – user779159

回答

0

標準的中間件ISN」 t已經足夠了,因爲它在全部運行之前運行了

這是不正確的,您可以定義一個在你把你的中間件,即(使用passport):

//passport setup 
app.use(passport.initialize()); 
app.use(passport.session()); 

passport.serializeUser(function(user, done) { 
    ... 
}); 

passport.deserializeUser(function(usr, done) { 
    ... 
}); 

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

在這種情況下passport.session()中間件將改變req目的在於提供passport.deserializeUser deserialised用戶fn,使得req.user可在連鎖店的任何地方獲得。

0

,你可以使用自定義的函數呈現這樣

function render(res) { 
    res.locals.user = res.user; 
    res.render('template.html', context); 
} 
+0

在每個路由函數中都會有不同的模板和上下文,以及從res到res.locals傳遞的細節,所以函數簽名將是函數render(res,template,context,thingsToPassToResLocals) ',這將變得非常笨拙。想知道是否有更簡單的方法? – user779159

+0

你的函數簽名更好,但我沒有看到任何其他方式來做到這一點(不完全是專家)。 – zola

相關問題