NPM + Jednoduchý HTTP server
NPM
NPM (dříve Node package manager) je program (a databáze) pro práci s balíčky knihovnami pro Node.js. Nový balíček vytvoříme příkazem npm init . Průvodce můžeme buďto pečlivě vyplnit nebo přeskákat enterem. Výsledek je package.json popisující náš Node.js balíček.
index.json
Pokud chceme používat ES Modules (import fs from ‘fs/promises’) místo CommonJS (const fs = require(’fs/promises’)) a zároveň mít soubory s příponou .js místo .mjs přidáme do package.json atribut "type": "module",.
main
Specifikuje název vstupního souboru, který by jsme měli (ale nemusíme) dodržet. Vytvoříme tedy index.js.
scripts
Je seznam scriptů, které můžeme přes NPM spouštet.
Obvyklé je mít scripty jako start, dev, prod pro spouštění aplikace v různých prostředích.
Instalace nových balíčků
Vyhledávat balíčky můžeme na stránkách NPM - https://www.npmjs.com/ a následně je nainstalujeme příkazem npm install <název balíčku>. Pro ukázku nainstalujeme balíček který nám umožní obarvit text vypisováný do konzole - chalk (https://www.npmjs.com/package/chalk).
Změny se promítnout do package.json + vznikne soubor package-lock.json kde jsou uzamknuté konkrétní verze nainstalovaných balíčk - tento lock soubor nikdy manuálně neupravujeme!
Nyní můžeme balíček chalk použít v kódu.
Nainstalované balíčky najdeme v adresáři node_modules.

Jednoduchý HTTP server
HTTP | Node.js v17.6.0 Documentation
http.createServer
https://nodejs.org/api/http.html#httpcreateserveroptions-requestlistener
Vytvoří server. Jako argument bere funkci která bude zpracovávat jednotlivá připojení.
server.listen
https://nodejs.org/api/http.html#serverlisten
Začne poslouchat na daném portu. Callback je zavolán jakmile se server úspěšně na port připojí a začne poslouchat - server neposlouchá ihned po zavolání .listen metody.
req
https://nodejs.org/api/http.html#class-httpclientrequest
Objekt obsahující požadavek od uživatele. Obsahuje vyžádanou URL, IP adresu, cookies, user agenta (identifikace prohlížeče), ...
res
https://nodejs.org/api/http.html#class-httpserverresponse
Objekt reprezentující odpověď serveru. Má spoustu užitečných metod. Voláním res.end() považujeme odpověď za finální a server ukončí spojení.
res.statusCode
Nastavuje status kód odpovědi. Mezi nejčastější patří 200 - OK, 404 - Not found a ruzné 5XX pro chyby serveru.

res.setHeader
Nastaví HTTP hlavičku. HTTP hlaviček je nepřeberné množství - https://en.wikipedia.org/wiki/List_of_HTTP_header_fields . Doporučuji si aspoň zapamatovat Content-Type která určuje typ odpovědi (HTML, JSON, JavaScript, JPG, ...) a Set-Cookie která řiká prohlížeči jaké cookies by měl uložit.
res.write
Odešle na klienta (prohlížeč) data, ale neukončí spojení. Vhodné pokud už máme část dat, ale čekáme na zbytek.
Nodemon
Protože server dlouhotrvající proces, musíme po každé změně zdrojového kódu zastavit Node.js a pustit script znovu. Toto restartování umí zautomatizovat balíček nodemon (https://www.npmjs.com/package/nodemon). Jelikož ho budeme potřebovat pouze při vývoji, nainstalujeme ho jako devDependency a přidáme do seznamu scriptů.
Výsek změněného package.jsonu
Spustíme server
Při změně zdrojových souborů se nyní server automaticky restartuje.
Samostatná práce
Přečtení index.html ze souboru
Vedle index.js souboru bude i index.html s libovolným html obsahem. Server bude po nastartování odpovídat na každý požadavek obsahem tohoto souboru.
Řešení
Přečtení index.html ze souboru
Servírování statických souborů z public adresáře
Vedle souboru index.js bude adresář public s libovolným obsahem (html soubory, obrázky, ...). Server bude odesílat tyto soubory na základě URL z requestu. Pokud tedy uživatel zadá url /about.html dostane soubor public/about.html a tak podobně.
Řešení
Servírování statických souborů z public adresáře
Pro pokročilé
Blokující vs neblokující kód
Proveďte zároveň dva dotazy ze dvou různých prohlížečů a podívejte se kdy je Node.js schopný přijmout oba požadavky a kdy pouze jeden.
