Express

DVOP WBB


Bc. Matěj Cajthaml — SSPŠ

©

Webový server

Webový server

  • server, který umí komunikovat nad HTTP
  • existují hloupé knihovny, které vytváří jen základy
  • pokročilé se starají i o hlavičky a další věci

Knihovna http v Node.js

  • knihovna http, již v instalaci Node.js
  • velmi jednoduchý server
  • musíme mít jednu velkou funkci pro celý server a nebo si napsat vlastní nástavbu

Vytvoření

Endpointy

Knihovna URL

Práce

S knihovnou HTTP se často používá URL. Zjistěte si, co tato knihovna umí a jak se používá.

Uložiště v paměti

Práce

Vytvořme Web API, které bude přijímat data a bude je uchovávat v operační paměti.

Express

Express

  • knihovna pro vytváření webového serveru nad HTTP
  • může vytvářet čisté Web API a nebo klidně server-side aplikaci
  • spousta pomocných balíčků
  • funguje na způsob middleware (více později)

Vytvoření

Co se stane, když přejdeme na adresu /aaaaaa/proc/jsou/dvopy/do/17.05?

Jak je možné, že se ukazuje automaticky HTML? Nechybí nám hlavička?

Endpointy

Metody na Response

  • .status(code)
  • .send("...")
  • .send({ aaa: "aaa" })

Co je v požadavku a odpovědi?

Práce

Podívejte se na dokumentaci Expressu a zjistěte, co je v požadavku a odpovědi.

Cesty endpointů

Cesty endpointů

  • můžeme používát spoustu matchingů
  • můžeme použít i regulární výrazy
  • povinné a nepovinné části
  • parametry

Parametry

Volání HTTP v JavaScriptu

Volání HTTP v JavaScriptu

  • můžeme použít: fetch, XMLHttpRequest, axios, ...
  • problémy s CORS (více později)

Fetch

Fronta úkolů

Práce

Vytvořte Web API, které má dva endpointy:

  • /request — dá úkol do fronty ke zpracování, vrací id
  • /:id — vrátí řešení úkolu podle id

Připomenutí Expressu

Práce

Připomeňme si, jak se s Express pracuje.

Bezpečenost

Minulou hodinu jsme měli problém s posíláním požadavků v prohlížeči. Kdo nám je zakázal posílat?

Jaké problémy by mohlo způsobit to, že dovolíme jakékoliv doméně posílat požadavky najakoukoliv doménu?

CORS

  • = Cross-origin resource sharing
  • mechanismus zabezpečení webové stránky
  • každý server si může říct, jaké domény mají k datům přístup
  • prohlížeč potom tyto nastavení kontroluje

CORS hlavičky

  • Access-Control-Allow-Origin: https://cajthaml.eu
  • Access-Control-Allow-Origin: *
  • odesílá server např. při požadavku OPTIONS

Hlavičky

Práce

Zjistěte, k čemu slouží:

  • Access-Control-Allow-Headers
  • Access-Control-Allow-Methods

CORS kontroluje prohlížeč. Může jej kontrolovat jakýkoliv klient, např. i Node.js server?

Balíček cors

  • dokumentace
  • automaticky posílá hlavičky při požadavcích

Content Security Policy

Práce

Zjistěte si, co je to Content Security Policy. Jak se liší oproti CORS?

Voláni API ze stránek

Práce

Vytvořme stránku a příslušné API složené ze dvou částí:

  • přidávání dat: pomocí formuláře přidáme data
  • čtení dat: můžeme data zobrazit

Hostování stránek

Co kdybychom nechtěli mít více serverů na API a hosting stránek? Lze to udělat nějak v Expressu?

A co když to nebude jeden soubor, ale více souborů a assetů?

Hostování stránek

Práce

Zhostujeme si naší statickou stránku pomocí express.static.

Souborový systém

Soubory v Node.js

  • knihovna fs v Node.js
  • asynchronní a synchronní akce
  • práce se složkami a soubory

Jak přistupujeme k souborům v prohlížeči?

Ukážeme si práci s FS.

Souborová paměť

Práce

Naší aplikaci přepíšeme do souborové paměti, aby se po restartu serveru data neztratila.

Je dobré ukládat naše data v plaintextu?

JSON v JS

  • JSON.parse(`...`)
  • JSON.stringify({...})

Další práce

  • TODO list
  • Fronta a její zpracování
  • Soubory

Middleware

Middleware

  • jedná se o funkci
  • přijímá většinou 3 parametry:
    • request — požadavek
    • response — odpověď
    • next — další funkci ve volání

Kaskáda

  • jednotlivé funkce jsou volány postupně
  • při zavolání funkce next() se zavolá další funkce v pořadí
  • ukončuje se taktéž pomocí volání res.send() a obdobných

Využití middlewares

  • spouštění kódu
  • validace požadavků
  • logování
  • autentizace a autorizace

Definice funkce

Pokročilejší funkce

S middleware jsme se již setkali — samotné volání app.METODA() jako druhý parametr middleware přijímá.

Na přidání middleware do pořadí stačí zavolat app.METODA() a nebo app.use(). Jednotlivé endpointy v app.METODA() mohou příjímat více middlewares.

Použití pomocí use

Použití v endpointu

Pokročilá kaskáda

Middleware umí zamítnout požadavek a nebo požadavek či odpověď serveru změnit a předávat tím data do dalších volání middlewares.

Počítadla

Pokročilé middleware

Dříve uvedený middleware není obecný. Proč? Jak to opravíme?

Pokročilé middleware

Práce

Opravte výše uvedený middleware tak, aby příjímal parametr pro požadovanou hlavičku.

Pokročilé middleware s polem

Práce

Opravte výše uvedený middleware tak, aby příjímal parametr a nebo pole pro požadované hlavičky.

Middleware k dispozici

  • express-rate-limit
  • compression
  • multer
  • timeout

Další middleware

Práce

Zkuste najít další zajímavý middleware. Zjistěte, jak se používá.

Routery

Aktuálně, když použijeme app.use, tak je middleware volána na všech následujících endpointech. Co bychom dělali, kdybychom ji na jednom endpointu nechtěli?

Routery

  • způsob, jak rozdělit express aplikaci do podčástí
  • každá část odpovídá na nějaký záčátek url, např. /user
  • uvnitř jsou schovány middleware a nedostávají se mimo

Vytvoření routeru

Zamezení middleware

Routery se používají i na rozdělení aplikace do menších částí — souborů.

Rozdělení routerů

Práce

Pro každý router vytvořte samostatný soubor a vytvořte v něm router. Vytvořte všechny potřebné endpointy a připojte je do hlavního routeru.

Základní autentifikace

Práce

Vytvořte API, které bude v hlavičce přijímat přístupové údaje, které budou potřeba pro jakoukoliv komunikaci mimo endpoint GET /ping.

API bude sloužit ke správně neurčitých dat. Tedy minimálně CRUD.

Rozložení aplikace

Rozložení aplikace

  • aplikaci je nutné rozdělit na menší (logické) části
  • často rozdělujeme routery, které můžeme na sebe propojovat
  • soubory s routery poté rozdělujeme na jednotlivé endpointy
/
├── src/
│   └── controllers/
│       ├── user/
│       │   ├── endpoints/
│       │   │   ├── getOne.js
│       │   │   ├── getAll.js
│       │   │   ├── updateOne.js
│       │   │   └── getFriendsForOne.js
│       │   └── user.js
│       └── grades/
│           └── ...
└── main.js

Jaké jsou nevýhody a výhody tohoto systému? Jak ho zlepšit?

Jak budeme tvořit další logické části — např. pomocné funkce, databázové entity, servisy a další věci?

Ukázka!

Vrstvení aplikace

Teorie vrstvení

  • moderní API nejsou jen o tom, že mají reagovat na určité endpointy
  • často se jedná o pokročilé procesy, které zařizují věci na jiných zdrojích
  • při návrhu aplikace je nutné přemýšlet o vrstvení

Vrstvení

  • způsob rozdělit aplikaci na jednotlivé vrstvy — layers
  • často se zaměnují za tiers — které reprezuntují fyzický stav
  • vrstva má vždy za úkol jednu část, kterou zpracovává, např:
    • přijmutí dat a jejich validace
    • získáni či úprava dat z databáze
    • zpracování požadavku
  • každá vrstva získává data z nižší vrstvy — nelze to naopak

Toto vrstvení používáme proto, aby nenastalo to, co děláme: endpointy řeší vše

Kolik vstvev by měla mít aplikace?

Často se používají různé modifikace, například to, že můžeme komunikovat s jakoukoliv vrstvou a nebo třeba vrstvy přeskakovat. Proč?

Základní třívrstvá architektura

  • prezentační vrstva (presentation layer)
  • aplikační vrstva (business layer)
  • datová vrstva (data access layer)

Často se používá tzv. model-view-controller (MVC) či model-view-presenter (MVP). Jak se liší oproti třívstvému návrhu?

Vrstvy, MVC či MVP nelze zaměňovat se službami — services. Jak se liší?

Microservices

  • moderní návrh aplikací
  • jedna aplikace se rozdělí do více menších aplikací
  • prezentační vrstva poté komunikuje s jednotlivými aplikacemi
  • např.: přihlašování, nahrávání videa, komentování
  • jaké jsou výhody a nevýhody?

Template engines

Template engine

  • knihovna, která má za úkol vykreslovat různé šablony
  • často pro HTML — generujeme stránky
  • požadavek ⇉ vykreslení ⇉ prohlížeč
  • v expressu předáváme proměnné, které šablony modifikují

pug

  • nejznámější template engine
  • instalace: npm install pug
  • aktivujeme: app.set('view engine', 'pug')
  • šablony — views — tvoříme ve složce views

Express

View

Další enginy

Práce

Nalezněte další template engines, které express podporuje. Podívejte, jak se definují jejich views.

Vstup od uživatele

Můžeme věřit vstupu od uživatele? Proč?

Validace dat

  • spousta možností validace
  • nejznámější: joi

Nahrávání souborů

Nahrávání

Práce

Zkusme vytvořit aplikaci, ve které půjde nahrávat a zobrazovat soubory.

Další metody v express

Všechno

  • .all
  • zachytí všechny metody
  • k čemu?

Validace parametrů

  • .param(param, middleware)
  • při zachycení parametru dle jména
  • zavolá se middleware
  • právě jednou

Validace parametrů

Zabezpečení

Používat šifrování — TLS / SSL.

Problémy si porty.

Nastavovat sprváné hlavičky — použít helmet.

Používat limitery — zamezit brute-force atakům.

Používat ověřené a nové verze knihoven — npm audit.

Vždy validovat vstup uživatele.

Skryté servery

Na jakém portu obyčejně běží HTTP / HTTPS?

Může bězet na jednom serveru více domén?

Co je to reverse proxy?

Backend většinou běží na nějakém (klidně nezabezpečeném) portu, který je díky firewallu nedostupný z internetu.

Hlavní správce web serveru (nginx, apache2) poté posílá požadavky z domény na určitý port a vrací požadavek.

Správa express backendu

Jak zapneme express backend?

Co když zavřeme terminál?

Co když server spadne?

Správce procesů

  • existuje spousta
  • starají se o to, aby proces vždy běžel
  • když spadne — restartuje se
  • když se server zapne — zapne se

  • docker, pm2, systemd

Ukázka pm2!

Opakování

  • express
  • endpointy
  • parametry
  • middleware
  • CORS
  • vrstvení
  • template engines

Děkuji za pozornost!

  • matej.cajthaml@ssps.cz
  • https://ssps.cajthaml.eu/