CategoryNodeJS

Vypnutí kešování www stránek

Někdy budete muset na úrovni HTML hlaviček vypnout kešování požadované stránky (cache). Důvod je zřejmý: měnící se obsah a snaha o zajištění distribuce aktuálního obsahu. Pak by se mohlo hodit info jak na to.

Nejdřív finta…

Možná nejjednodušším řešením jak zamezit kešování je změna adresy v samotném odkazu na stránku, kterou nechcete kešovat:

Ze serveru se generuje stránka, která obsahuje pokaždé jiný odkaz. Ten se mění díky vkládání časového razítka přímo do URL odkazu a proto bude stránka po každé znovu načtena…

A nebo pak jinak…

HTML

NodeJS

PHP

Python s Flaskem

Nginx

Apache .htaccess

IED: alternativa k NPM

ied
NPM je skvělý a určitě je jedním z hlavních důvodů, proč NodeJS zažívá takový boom.
V současné době se NPM prokousalo k 3. verzi, která řeší víceméně všechny neduhy 2. verze, jako je rychlost, adresářová struktura, velikost stahovaných dat a podobně.

IED

I když je NPM 3 opravdu daleko lepší než 2, stále má své rezervy. A na ně příjdete například v momentě, kdy si vyzkoušíte alternativního správce balíčků jako je IED, který je v rámci NodeJS plně kompatabilní, což znamená, že i přes velké změny v interní struktůře uložiště pozžívaných knihoven ve vaší aplikaci, poběží vše jak má.

Asi nejvýraznější výhodou je jeho opravdová rychlost při instalaci požadovaných balíčků specifikovaných v package.json. Otestoval jsem NPM i IED na ne příliš velké aplikaci, která používá cca 20 knihoven z NPM repozitáře. Pomocí NPM jsem měl nainstalováno za 24 sekund, ale s IED jen za 6. A to je opravdu fofr!

Protože 3. verze NPM už má flat model instalovaných balíčků, neni úspora místa a vše co s tím ouvisí (velikost stahovaných dat a podobně..) tak významné. Cca 44MB zabíral adresář node_modules instalovaný jak pomocí NPM i IED.

Asi jedinou nevýhodou na kterou jsem u IED narazil je absence příkazu udate, pro aktualizaci stažených, nainstalovaných NPM balíčků. NPM má příkaz npm command, který se pokusí aktualizovat všechny balíčky definované v package.json. A to dělá docela rychle: očekování nových verzí cca 20 balíčků v projektu trvalo cca 1.5 sekund. Dobrý.

NPM závislosti

Jednou z neskutečných výhod NodeJS je jeho NPM. Jedná se o dnes nejrychleji rostoucí balíčkovací systém. Repozitář obsajuje hotové balíčky snad na vše co vás napadne. Stačí jen stáhnout a použít.

No a pak se může hodit online grafická vizualizace závislostí jakéhokoliv baličku. Jedná se o webovou stránku, kde zadáte název NPM modulu a získáte pěkný obrázek s grafickým znázorněním závislosti zadaného balíčku. Výsledek můžete prohlížet i jako 3D model… 🙂

npm-zavislosti
Tohle je graf závislostí populárního balíčku express.

PhantomJS: web screen capture

phantomjs2

Už jste někdy potřebovali automaticky a sbírat náhledy webových stránek z prohlížeče (screenshoty)? Pak asi nejjednodušším řešením je použití PhantomJS, který, jak o sobě uvádí, je full web stack, no browser required řešením:

Výsledkem scriptu je sada PNG obrázků se screenshoty požadovaných webových stránek. Jedná se o rychlý návod jak na to. Samotný script by se dal ještě dopracovat…
PhantomJS se dá použí ke spoustě dalších věcí. Já jej používám např. i pro vytváření PDF dokumentů na webovém serveru.

JavaScript and Node FUNdamentals

5178Ep21UkL._SX384_BO1,204,203,200_

Javascript And Node Fundametals

Mongoose a new Date()

Pokud v NodeJS používáte pro práci s databázi MongoDB knihovnu Mongoose a snažíte se ulehčit si práci při ukládání dat do collections skrze defaultní hodnotu prvku jako já:

Pak se dočkáte nemilého překvapení, že vám nebude čas v databázi sedět s reálným časem. Až jako já prohledáte všechny možnosti kde se na vašem serveru nastavuje timezone a zjsitíte, že máte vše OK, začnete pátrat kolem MongoDB, respektive přímo v Mongoose…

UTC

No a pak zjisíte, že váš čas je ukládán v UTC, a proto nesedí.

clock-change-time-dst

Řešení

Protože jsem v databázi měl opravdu skutečný čas, je potřeba zrušit hodnotu default v definici mongoose schematu vaší collection a datum s časem si vypočítat sám:

Co byste měli vědět o NPM

npmjs.com

Vytvořil jsem si účet na NpmJS.com. Myslím si, že už jsem v JavaScriptu pod NodeJS něco napsal a asi přišel čas něco vrátit komunitě zpět. Chystám se z toho co jsem už napsal vytovřit nějaké opakovaně použitelné báličky publikovat na NpmJS a dát tak volně k použití všem. Nečekejte nic světobornéhé.
Dalším důvodem proč to dělám je interní osahání si procesů na NpmJS a asi nejlíp jak se do toho dostat je sám publikovat.

NodeJS, ExpressJS, Jade a Session

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:

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 /

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:

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é.

NodeJS: konvert CSV na JSON

Potřeboval jsem do MongoDB naimportovat hafo dat z Excelu. Nejjednodušší bylo XLS soubor uložit do CSV a pak jednotlivé řádky zkonvertovat na JSON objekty.
Asi takhle:

Nutno ještě dodat, že k tomuto existuje spousta NPM balíčku a když jsem s s převodem začínal, jasně že jsem šáhnul po nějakém z nich. Ale protože jsem neuspěl s implementací hned napoprvé, tak jsem si to napsal sám…
Načtení 684 řádku do pole JSON objektů na mém Macovi trvalo 0.144s….

© 2017 pepa.holla.cz

Theme by Anders NorénUp ↑