Jade je super šablonovací jazyk. Pokud jste opravdu líný programátor, pak se vám bude líbit. Jeho asi největší výhodou je maximální úspornost. Vůbec se nepoužívají párovací tagy a celý kód je strukturovaný jen dle odsazení. Něco ala Python. Až si na to zvyknete, bude vám HTML opravdu vadit…
Jade template:
doctype html html(lang="cs") head title= pageTitle script(type='text/javascript'). if (true) { alert('jedeme') } body h1 Jade - node template engine #container.col if youAreUsingJade p You are amazing else p Get on it! p. Jade is a terse and simple
Kód je daleko skromnější a přitom daleko přehlednější…
A možná i díky tomu se dá do šablony lépe integrovat jakákoliv aplikační logika. Přímo na serveru můžete v šablonu ohýbat, modifikovat… Něco jako je celé PHP 🙂 A přitom jasně zůstává vaše NodeJS aplikace nad šablonou, které jen předáváte nějaka data a necháváte ji dál dělat co má. A to z ní děla další živý kus celé aplikace. Beze sporu výhoda, ať už si o aplikační logice v prezentační vrstvě myslíte cokoliv…
No a tady se do hry dotávájí sessions, proměnné jen mezi aplikací a konkrétním uživatelem vaší aplikace (webové stránky).
Ty se v NodeJS a ExpressJS asi nejčastěji řeší přes NPM balíček express-session a pak nějaký backend pro jejich ukládání, ale to nutně není podmínkou. Balíček se postará i o toto. Já tedy používám connect-redis, ale je na vás jak své session proměnné budete ukládat.
A teď se dostávám k tomu jak to celé funguje spolu dohromady.
NodeJS, ExpressJS, Jade, Session
Pokud už pracujete se sessions, pak k nim máte přístup v objektu request a to je vám v momentě. kdy už jste v prezentační fázi a pracujete s objektem response celkem k ničemu.
Řešení je nasnadě: proměnnou session umístit do datové struktury, kterou pak předáte funkci render, která se postará o vykreslení šablony:
NodeJS obsluha pro routu /
function getIndex(req, res){ res.render('index.pug', { session: req.session, data: 'neco' }); }
html head title Ahoj body h1 Ahoj, #{session.user.name} p= data
Super, tohle funguje, ale pokud furt něco renderujete a máte hafo šablon, pak je to vopruz…
Alternativní řešení pomocí middleware
Abych měl k proměnné session přísup v každé jade šabloně a nemusel ji pokaždé předávat přes slovník s proměnnými ve funkci render. Napsal jsem si jednouduchou middleware funkci, která je volána pro každé zpracování requestu:
var app = express(); app.use(function(req, res, nect){ res.locals.session = req.session ? req.session : null; next(); });
Proměnná session je tak dosupná přímo v Jade šabloně jen pomocí svého jména, jako byste ji předaly v objektu ve funkci render.
Holla!
Middleware je docela silná stránka frameworku ExpressJS. Můžete si sami napsat vlastní celou rouru obslužných rutin, které se budou postupně provádět. V každéé z nich mlžete mít nějakou logiku, zpracování dat a podobně. Síla. Extrémně použitelné.