JavaScript na serveru: Začínáme s Node.js

node.js logo

Máloco vyvolalo ve světě webových technologií poslední dobou stejnou vřavu jako serverový framework Node.js. Někomu se zdá samotná myšlenka použití JavaScriptu na serveru špatná, ale pokud k takovým lidem nepatříte a zajímá vás, proč způsobil Node.js takový zájem, naleznete odpověď v následujícím seriálu.

Seriál: Node.js - s JavaScriptem na serveru (13 dílů)

  1. JavaScript na serveru: Začínáme s Node.js 23.11.2010
  2. JavaScript na serveru: Patří budoucnost Node.js? 21.9.2012
  3. JavaScript na serveru: Architektura a první Hello World 5.10.2012
  4. JavaScript na serveru: moduly a npm 12.10.2012
  5. JavaScript na serveru: začínáme programovat e-shop 19.10.2012
  6. JavaScript na serveru: MongoDB, Mongoose a AngularJS 26.10.2012
  7. JavaScript na serveru: Testování a kontinuální integrace 2.11.2012
  8. JavaScript na serveru: REST API 9.11.2012
  9. JavaScript na serveru: implementace REST API 16.11.2012
  10. JavaScript na serveru: nástroje a dokumentace 23.11.2012
  11. Začínáme s AngularJS 30.11.2012
  12. AngularJS direktivy a testování 7.12.2012
  13. JavaScript na serveru: CoffeeScript a šablonovací systémy 14.12.2012

Node.js je vysoce výkonné, událostmi řízené prostředí pro Javascript. Už jsme o něm na Zdrojáku dříve psali, ale i tak jistě dokáže tato první věta rozpoutat v komentářích pod článkem peklo. Nuže – komentujte, my ale pokračujeme dál.

Základem Node.js je javascriptový interpret V8 z Google Chrome. Nad ním je tenká vrstva kódu v C++ poskytující minimální nutné zázemí (event-loop vyhodnocující příchozí události, obsluha I/O bufferů a jiné).

Nic z toho ale není momentálně pro nás důležité – Node se snaží být navržen tak, aby tyto nízkoúrovňové problémy vyřešil správně za vás. Některými detaily/vnitřnostmi se budeme zabývat v dalších článcích. Prozatím postačí vědět, že uživatelské rozhraní pro Node je čistý JavaScript v jediném vlákně – a v 99 % případů vše magicky funguje VELMI rychle a škálovatelně.

Článek je prvním ze série, kterou zde na Zdrojáku chystáme. V navazujících článcích se postupně podíváme na stavbu aplikace z modulů (CommonJS), postavíme si v rychlosti pár web aplikací (pomocí Connect a Express), řešení pro streamování a real-time komunikaci (Socket.IO) a dojde i na deployment na produkční prostředí. Při tom všem ovšem musíme používat instalaci Node včetně podpory pro debugování, balíčkovacího systému a jiných nástrojů. V dnešním článku společně projdeme instalaci, abychom jí porozuměli a měli společnou základnu. Pokud nemáte moc času, můžete pro hraní/experimenty použít už připravenou image virtuálního serveru, viz návod na konci článku. A tady je v kostce to, o co přijdete:

  • nainstalujeme Node včetně debug podpory;
  • Node má novou nestabilní verzi 0.3, my ale zůstaneme u 0.2.x z důvodu kompatibility;
  • poté nainstalujeme balíčkovací systém pro Node – NPM (node package manager);
  • na závěr nainstalujeme debugger node-inspector
  • a poté si ještě zkusíme odladit jednoduchý program

Níže popisované příklady budou platné pro Linux/UNIX/OS X. Pokud máte Windows, budu od vás očekávat trochu vlastní iniciativy – tedy rozchodit obdobu UNIXových příkladů v Cygwin prostředí. Další dobrá alternativa k experimentování je už je virtuální server od VirtualMasteru, viz konec článku.

Instalace Node

Instalaci provedeme kompilací ze zdrojových kódů, ale nebojte se, Node má málo dependencí a kompiluje se snadno. V nedávné době vyšla nová verze 0.3, nicméně jedná se zatím o nestabilní větev s podstatnými změnami v API. Proto budeme používat poslední stabilní verzi z 0.2 větve. Stáhněte si příslušný zdrojový kód, rozbalte a nainstalujte nějak takto:

$ tar xzf node-v0.2.5.tar.gz
$ cd node-v0.2.5
$ ./configure --debug # důležité, zde je nastavení pro podporu ladění
$ make
$ sudo make install # pokud instalujete do /usr/local, budete (zatím) potřebovat root práva 

Instalace NPM

Hned druhý krok bude instalace balíčkovacího systému npm, což je taková Node varianta rubygems. Umožní vám jednoduše prohlížet a instalovat Node programy a knihovny, včetně závislostí. Je dobré zmínit, že npm má poněkud agresivní zásady vynucování bezpečnosti a bude vás VELMI otravovat, pokud ho nainstalujete a budete používat pod root uživatelem. Nedoporučuji. Naopak defaultní instalace směřuje do /usr/local (který obvykle root práva vyžaduje) a autor je toho názoru, že je vhodné /usr/local prostě změnit vlastníka. S trochou skřípění zubů, ale budiž:

$ whoami
node # not root!
$ sudo chown -R $USER /usr/local
$ curl http://npmjs.org/install.sh | sh 

Instalace debuggeru

Jakmile se zanoříte po uši do nového jazyka nebo prostředí, přijdou problémy. Přijdou zaručeně, možná by šlo si podle nich i řídit hodinky, protože vaše kroky v Node krajině budou lemovány zleva i zprava kódem alfa-kvality. Proto je dobré začít od píky tím, že si hned na začátku rozchodíme prostředí pro ladění.

Ačkoliv je Node prostředí mladé, máte překvapivě hned několik možností, např. integrovaný debugger v Eclipse či command-line debugger. Autor článku za vás ale autoritativně vybral interaktivní debugger založený na JS debuggeru ve Webkit Inspectoru (debuggeru v Chrome a Safari). Poprvé si na něm taky v praxi ukážeme, jak nainstalovat npm modul (nezapomeňte změnit vlastníka /usr/local a vnořených složek pro aktuálního usera):

$ npm install node-inspector
...
npm ERR! node-inspector@0.1.0 not compatible with your version of node
npm ERR! Requires: node@>=0.3.0
npm ERR! You have: node@v0.2.4
npm not ok 

No – to se příliš nepovedlo. Hned v praxi tedy vidíte, jaké problémy může přinášet dynamicky se vyvíjející platforma. Nejnovější verze node-inspector pracuje pouze s Node >= 0.3 – s níž ovšem zase nefunguje spousta jiných knihoven, které budeme používat, a proto jsme nainstalovali z důvodů kompatibility nejnovější stable branch 0.2.4. (Samozřejmě jsem si to mohl odpustit, nicméně na podobné problémy asi narazíte za chvíli sami, je dobré si s nimi umět poradit. – pozn.aut.) Inu, nezbývá než vyzkoušet předchozí verzi:

$ npm ls | grep node-inspector
node-inspector@0.0.1      =dannycoates remote
node-inspector@0.0.2      =dannycoates remote
node-inspector@0.0.3      =dannycoates remote
node-inspector@0.0.4      =dannycoates remote
node-inspector@0.1.0      =dannycoates latest remote
$ npm install node-inspector@0.0.4
...
npm info build Success: node-inspector@0.0.4
npm ok 

To už je lepší. Pokud všechno půjde dobře, měl by vám nyní v příkazové řádce fungovat příkaz node-inspector (zatím ale neudělá nic).

Jen v rychlosti si načrtneme, jak řešení funguje: protože jsme Node společnými silami na začátku nakonfigurovali před kompilací pro podporu ladění, akceptuje nyní node příkaz parametr —debug. Pokud se takto pustí, Node předává informace na lokálním portu. node-inspector potom nad tímto základním rozhraním provozuje výše zmíněný debugger WebKitu a informace mezi ním a Node procesem překládá.

Výsledek je sympatický – můžete debugovat ve stejném prostředí jak svůj serverový kód, tak svůj klientský kód. Navíc můžete debugovat kód přes internet na jiném počítači, dokonce můžete debugovat z víc míst najednou. Je to tedy takový MMODBG – Massively Multiplayer Online Debugger.

Pozdrav slušně!

Nastal onen klíčový moment, kdy zkusíme pozdravit svět! Abych vám to usnadnil, připravil jsem ukázkový program už s chybou, takže si trochu zaladíme. Pokud jste tak ještě neučinili, pusťte node-inspector na pozadí (ukončit ho později můžete příkazem  killall node-inspector):

$ node-inspector & 

A dále si zkopírujte/uložte do souboru hello-world.js následující kód:

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  req.end('Hello Worldn');
}).listen(8124);
console.log('Server running at http://localhost:8124/');

Tohle je základní a mnohokrát omílaný příklad HTTP serveru, který na každý požadavek vrací “Hello World”. Ale tenhle je drobně pozměněn, takže nefunguje. Spusťte příklad debug příkazem:

$ node --debug hello-world.js
debugger listening on port 5858
Server running at http://localhost:8124/ 

Nejprve Node zahlásí, že debugovací informace jsou dostupné na portu 5858, a poté hello-world.js (řádka 6) zahlásí že byl spuštěn HTTP server na portu 8124. Zkuste se nyní tedy připojit na http://localhost:8124/

/Users/jakub/Sites/node/hello-world.js:4
  req.end('Hello Worldn');
      ^
TypeError: Object #<an IncomingMessage> has no method 'end'
    at Server.<anonymous> (/Users/jakub/Sites/node/hello-world.js:4:7)
    at Server.emit (events:27:15)
    at HTTPParser.onIncoming (http:831:10)
    at HTTPParser.onHeadersComplete (http:87:31)
    at Stream.ondata (http:763:22)
    at IOWatcher.callback (net:494:29)
    at node.js:773:9
$ 

Ouha. Jak vidíte, aplikace zahlásila výjimku a spadla. Ze stacktrace je vidět, že na řádce 4 tvrdí, že objekt req nemá metodu end. Pusťte tedy pokusný skript ještě jednou ( node --debug hello-world.js) a pojďme se podívat, co se na místě děje. Otevřete v prohlížeči tentokrát node-inspector na http://localhost:8080/. Po připojení bude potřeba přepnout se do správného souboru (Node jich naimportuje na základně závislostí více – ale o tom si povíme v příštím díle) – viz obrázek:

Kliknutím vlevo od řádky 3 umístěte breakpoint. Nyní se běh programu přeruší automaticky na této řádce. Aby program do tohoto callbacku vstoupil, otevřete si v druhém okně prohlížeče znovu na aplikaci, kterou ladíme – na portu 8124. Tentokrát, jak vidíte, prohlížeč odpověď nedostane a jen se točí – aplikace totiž v druhém okně čeká na našem breakpointu:

Nebudeme tedy v tomto jednoduchém a trochu umělém příkladu dále chodit kolem horké kaše – překlep je na další řádce, ukončit je samozřejmě potřeba výstupní proud v proměnné res (response), nikoliv vstup req (request). Stačí dvakrát poklepat na zmíněnou řádku a můžete kód přímo naživo upravovat – přepište tedy q na s a kliknutím na jinou řádku změny uložíte. Nyní můžete program dál pustit (v pravém horním rohu).

To by bylo pro dnešek všechno. Pokud se v průběhu návodu někde zaseknete, neváhejte napsat do komentářů pod článkem o pomoc. V příštím díle seriálu se podíváme na způsob, jakým do své aplikace naimportujeme knihovny a cizí kód (CommonJS Modules) a představíme si několik jednoduchých knihoven pro rychlou tvorbu web aplikací (Connect a Express).


Hrajeme si v oblacích

Pokud nemáte čas či energii celou instalací projít, ale přesto byste chtěli zkusit začít experimentovat s Node, mám tu pro vás speciální nabídku. Připravil jsem pro vás virtuální obraz disku, se založeným non-root uživatelem, s nainstalovaným node a npm a node-inspector. Pokud se opravdu chcete připravit o potěšení vše nainstalovat sami, zde je rychlý způsob jak do experimentování naskočit. A bude vás to stát bratru zhruba korunu na den!

Upozornění: přes veškerou snahu se autorovi zatím nedaří obejít chybu v implementaci debuggeru pod Ubuntu. Kapitoly o ladění pomocí debuggeru bude potřeba zatím přeskočit. Pokud problém bude vyřešen, upravím šablonu a upozorním na ni v dalším článku.

  • založte si účet u VirtualMaster.cz
  • otevřete si Zdroják node.js šablonu serveru a vytvořte nový server
  • přihlaste se ssh node@<ip-adresa> (ip adresa přijde mailem), heslo k tomuto uživateli je  changeit
  • po přihlášení toto heslo změňte (příkazem passwd) na něco více osobního
  • pokud chcete, přidejte svůj veřejný klíč do ~/.ssh/authorized_keys

Founder & CEO of apiary.io, previously director of engineering in GoodData.

Komentáře: 23

Přehled komentářů

Martin Soušek proč takový zájem
Jakub Re: proč takový zájem
Tomáš Witek Re: proč takový zájem
Node.js potenciál Re: proč takový zájem
Tomáš Re: proč takový zájem
Jakub Re: proč takový zájem
Mastodont Re: proč takový zájem
karmi Alternativní instalace npm
Jakub Re: Alternativní instalace npm
vetesnik Jenom taková technická
Jakub Re: Jenom taková technická
vetesnik Re: Jenom taková technická
Michal Augustýn pár dotázek
Daniel Steigerwald Re: pár dotázek
Daniel Steigerwald Re: pár dotázek
Michal Augustýn Re: pár dotázek
dasim Re: JavaScript na serveru: Začínáme s Node.js
Martin Malý Re: JavaScript na serveru: Začínáme s Node.js
echy Debug v Ubuntu
OJ a další díl bude pod stromeček ?
ptica virtualmaster zdrazil?
vencax Nedari se mi debugovat
vencax Re: Nedari se mi debugovat
Zdroj: http://www.zdrojak.cz/?p=3373