DVOP WBB
Bc. Matěj Cajthaml — SSPŠ
©
hloupéknihovny, které vytváří jen základy
S knihovnou HTTP se často používá URL. Zjistěte si, co tato knihovna umí a jak se používá.
Vytvořme Web API, které bude přijímat data a bude je uchovávat v operační paměti.
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?
.status(code)
.send("...")
.send({ aaa: "aaa" })
Podívejte se na dokumentaci Expressu a zjistěte, co je v požadavku a odpovědi.
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 idPřipomeňme si, jak se s Express pracuje.
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?
Access-Control-Allow-Origin: https://cajthaml.eu
Access-Control-Allow-Origin: *
OPTIONS
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?
Zjistěte si, co je to Content Security Policy. Jak se liší oproti CORS?
Vytvořme stránku a příslušné API složené ze dvou částí:
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ů?
Zhostujeme si naší statickou stránku pomocí express.static
.
fs
v Node.jsJak přistupujeme k souborům v prohlížeči?
Ukážeme si práci s FS.
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.parse(`...`)
JSON.stringify({...})
next()
se zavolá další funkce v pořadíres.send()
a obdobných
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.
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.
Dříve uvedený middleware není obecný. Proč? Jak to opravíme?
Opravte výše uvedený middleware tak, aby příjímal parametr pro požadovanou hlavičku.
Opravte výše uvedený middleware tak, aby příjímal parametr a nebo pole pro požadované hlavičky.
Zkuste najít další zajímavý middleware. Zjistěte, jak se používá.
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?
/user
schoványmiddleware a nedostávají se mimo
Routery se používají i na rozdělení aplikace do menších částí — souborů.
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.
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.
/
├── 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!
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č?
Č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ší?
npm install pug
app.set('view engine', 'pug')
views
Nalezněte další template engines, které express podporuje. Podívejte, jak se definují jejich views.
Můžeme věřit vstupu od uživatele? Proč?
Zkusme vytvořit aplikaci, ve které půjde nahrávat a zobrazovat soubory.
.all
.param(param, middleware)
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.
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.
Jak zapneme express backend?
Co když zavřeme terminál?
Co když server spadne?
Ukázka pm2!