Při návrhu REST API v prostředí Node.js stojíte před zásadním rozhodnutím: sáhnout po frameworku Express, nebo vystačit s čistým Node.js. Express je de facto standardem pro tvorbu API, ale jeho použití s sebou nese určité návyky, které mohou vést k nepřehlednému kódu. Na druhou stranu, čistý Node.js dává naprostou kontrolu, ale za cenu vyššího úsilí při implementaci běžných funkcí, jako je parsování těla požadavku nebo směrování.
Posledním tipem je použití nástrojů pro hledání problémů. IDE umí analyzovat kód a upozornit na duplicity, nepoužité proměnné nebo příliš složité podmínky. Využijte tyto signály jako vodítko, kde refaktoring skutečně pomůže. Nezaměřujte se však na každé varování – některá jsou jen stylistická. Rozhodující je, zda je kód srozumitelný a snadno testovatelný. Po každé větší změně spusťte celou sadu testů. Pokud testy neexistují, napište alespoň základní. Vestavěné nástroje vám poskytnou bezpečí, ale nezaručí, že logika zůstane správná – to je stále odpovědnost autora.
Když narazíte na chybu, nejprve zkontrolujte tři věci: URL, hlavičky a tělo požadavku. Často se stane, že v URL chybí lomítko na konci nebo je použita špatná metoda (například GET místo POST). V hlavičkách může být překlep v názvu – místo Content-Type píšete Content-type, což některé servery tolerují, ale jiné ne. V těle zase může být špatně uzavřená závorka nebo chybějící čárka, což JSON neodpustí. Využijte funkci Console, která zobrazí přesně to, co se odešle na server, a porovnejte s dokumentací API.
Zpracování chyb v Expressu vyžaduje určitou pozornost. Pokud v asynchronní obsluze trasy dojde k výjimce, musíte ji buď zachytit a předat next(err), nebo použít helper, který to za vás udělá. Bez toho Express zpracuje chybu standardním způsobem, ale dostanete nepřehlednou HTML stránku místo JSON. Definujte si vlastní middleware pro chyby na konci souboru – přijme čtyři parametry (err, req, res, next) a podle typu chyby nastaví odpovídající status a JSON tělo. Tím zajistíte, že i neočekávaná chyba vrátí klientovi užitečnou informaci.
Největší past: sdílená data a pořadí testů Pytest spouští testy v definovaném pořadí, ale vy na to nesmíte spoléhat. Jakmile začnete psát testy, které závisí na pořadí (např. „nejdřív vytvořím záznam, pak ho smažu”), dříve nebo později narazíte. Typický průšvih je použití stejné dočasné databáze nebo souboru pro více testů. Jeden test zapíše data, druhý je přečte, ale pokud testy poběží paralelně nebo v jiném pořadí, vše se rozsype. Řešením je každému testu dát vlastní izolované prostředí – ať už dočasný adresář, nebo prázdnou tabulku v databázi. V pytestu na to máte fixture tmp_path, která vám vytvoří unikátní složku pro každý test.
Na závěr si řekněme, jak testy spouštět, aby vám nedělaly naschvály. Nikdy nespouštějte pytest z adresáře, kde máte testy i produkční kód, pokud nemáte jasně nastavenou strukturu projektů. Vytvořte si složku tests a v ní soubory s názvy jako test_*.py. Dále používejte pytest.ini nebo pyproject.toml pro konfiguraci, třeba pro nastavení cesty k testům nebo pro vypnutí varování. Tím se vyhnete situacím, kdy testy fungují jen na vašem počítači, ale v CI prostředí padají na nesprávné cestě nebo kvůli chybějícím závislostem. A až budete chtít zjistit, která část kódu není pokrytá testy, použijte nástroj pytest-cov – jen pozor na to, že pokrytí 100 % neznamená, že máte dobré testy, ale že jste pokryli všechny řádky, což je někdy víc škody než užitku.
Základní rozdíl mezi editory a plnohodnotnými IDE spočívá v tom, co vám nabídnou po instalaci. Editor jako Visual Studio Code nebo Sublime Text je rychlý a nenáročný, ale ladění, správa virtuálních prostředí nebo automatické doplňování kódu si musíte nastavit ručně. Plnohodnotné IDE, jako je PyCharm, vám tyto funkce dá hned, ale za cenu vyšší spotřeby paměti a pomalejšího startu. Pro malé skripty a jednorázové úlohy je proto lepší lehký editor, pro větší projekty s mnoha moduly se vyplatí sáhnout po robustnějším nástroji.
Když začnete testovat v Pythonu, pytest vypadá jako jasná volba. Krátké funkce, žádná třída, žádný boilerplate. Ale po pár týdnech narazíte na problém: testy občas projdou, občas ne, a vy netušíte proč. Nejčastější příčina? Testy nejsou izolované. Jedna funkce změní globální stav, druhá na to doplatí. Řešení je jednoduché – použijte fixture, ale ne jen tak ledajaké.
Při práci s dědičností oceníte pull up a push down. Pull up přesune metodu nebo pole do nadtřídy, push down naopak do podtříd. IDE automaticky opraví definice a volání. Tyto operace jsou bezpečné, ale vyžadují, abyste měli jasno v hierarchii tříd – jinak můžete omylem změnit chování programu. Obdobně funguje i funkce Extract Interface, která z existující třídy vytvoří rozhraní a přiřadí ji třídě. To se hodí při testování a zavádění závislostí, ale dejte pozor na to, že se rozhraní musí promítnout do všech na místech, kde se třída používá.