Úvod
Svět vývoje backendu prošel v posledních dvou letech tektonickým posunem. Téměř deset let zůstával Express 4.x průmyslovým standardem, což vyžadovalo, aby se vývojáři spoléhali na knihovny třetích stran pro základní úkoly, jako je zpracování asynchronních chyb nebo provádění HTTP požadavků. S příchodem Express 5.0 a Node.js 22/23 LTS se však ekosystém vyvinul v efektivnější, výkonnější a bezpečnější prostředí.
Budování REST API v roce 2025 už není jen o směrování (routing); je to o typové bezpečnosti, návrhu založeném na kontraktu (contract-first design) a využívání nativních schopností runtime prostředí, které dříve nebyly k dispozici. Tato příručka zkoumá, jak stavět profesionální REST API s využitím nejnovějších funkcí Node.js a Express, od základního nastavení až po pokročilé architektonické vzory.
Moderní základy: Node.js 22 a Express 5.0
Než napíšete jediný řádek kódu, je nezbytné porozumět modernímu prostředí. Node.js 22 představilo funkce, které výrazně snižují "únavu ze závislostí" (dependency fatigue).
Přechod na ES Moduly (ESM)
CommonJS (require) je v moderním ekosystému Node.js fakticky zastaralým formátem. Nastavením "type": "module" ve vašem package.json získáte přístup k top-level await a lepší statické analýze pro nástroje na bundling.
{
"name": "modern-express-api",
"version": "1.0.0",
"type": "module",
"dependencies": {
"express": "^5.0.0",
"zod": "^3.23.0"
}
}Express 5.0: Nativní podpora Async
Nejvýznamnější aktualizací v Express 5.0 je nativní zpracování Promises. V Express 4 by nezpracované zamítnutí (unhandled rejection) v async routě způsobilo zaseknutí požadavku nebo pád procesu, pokud by nebylo obaleno blokem try-catch nebo pomocníkem jako express-async-handler. Express 5.0 tyto chyby automaticky zachytí a předá je vašemu globálnímu middleware pro zpracování chyb.
Nativní Fetch a WebSockets
Node.js 22 stabilizuje nativní fetch API. To znamená, že vaše REST API může nyní komunikovat s jinými mikroslužbami bez režie knihoven jako axios nebo node-fetch. Navíc zahrnutí node:ws poskytuje nativní cestu pro přidání real-time schopností do vašich RESTful endpointů.
Architektonická dokonalost: Třívrstvý vzor
Častou chybou při vývoji v Express je syndrom "tlustého kontroleru" (Fat Controller), kdy veškerá byznys logika, databázové dotazy a validace sídlí v obsluze routy. Pro vybudování škálovatelného API implementujeme modulární třívrstvou architekturu.
1. Vrstva kontrolerů (Controller Layer)
Jedinou zodpovědností kontroleru je obsluha HTTP "rozhraní". Parsuje požadavek, volá příslušnou službu a vrací formátovanou odpověď. Nikdy by neměl přímo komunikovat s databází.
2. Servisní vrstva (Service Layer)
Toto je srdce vaší aplikace. Servisní vrstva obsahuje hlavní byznys logiku. Pokud potřebujete vypočítat slevu, odeslat e-mail nebo zkontrolovat způsobilost uživatele, děje se to zde. Tato vrstva je nezávislá na frameworku, což usnadňuje testování nebo pozdější přechod na jiný framework.
3. Vrstva pro přístup k datům (Data Access Layer - DAL)
DAL komunikuje s vaší databází. Pomocí ORM jako Prisma nebo ODM jako Mongoose tato vrstva abstrahuje dotazy. Izolací přístupu k datům můžete přejít z PostgreSQL na MongoDB s minimálním dopadem na vaši byznys logiku.

Implementace CRUD s typovou bezpečností a validací
V roce 2025 je důvěra ve vstup od klienta kritickým bezpečnostním rizikem. Pro validaci za běhu používáme Zod a pro bezpečnost v čase kompilace TypeScript.
Definice schématu
Zod vám umožňuje definovat schéma, které validuje req.body a současně generuje TypeScript typ.
import { z } from 'zod';
export const CreateUserSchema = z.object({
email: z.string().email(),
password: z.string().min(8),
role: z.enum(['USER', 'ADMIN']).default('USER'),
});
type CreateUserDto = z.infer<typeof CreateUserSchema>;Route Handler v Express 5.0
Všimněte si, jak čistá se routa stane, když využijeme nativní zpracování promises v Express 5.0 a centralizovaný validační middleware.
import express from 'express';
import { userService } from '../services/user.service.js';
import { validate } from '../middleware/validate.js';
import { CreateUserSchema } from '../schemas/user.schema.js';
const router = express.Router();
router.post('/', validate(CreateUserSchema), async (req, res) => {
// Logika se spustí pouze pokud validace uspěje
const newUser = await userService.createUser(req.body);
res.status(201).json(newUser);
});
export default router;Centralizované zpracování chyb
Místo roztroušených volání res.status(500) používáme globální error handler. Express 5.0 jej činí výkonnějším tím, že automaticky zachycuje chyby vyhozené z asynchronních funkcí.
// middleware/errorHandler.js
export const errorHandler = (err, req, res, next) => {
const statusCode = err.statusCode || 500;
const message = err.message || 'Internal Server Error';
console.error(`[Error] ${req.method} ${req.url}:`, err);
res.status(statusCode).json({
status: 'error',
code: err.code || 'INTERNAL_ERROR',
message,
...(process.env.NODE_ENV === 'development' && { stack: err.stack })
});
};Pokročilé techniky: Bezpečnost a výkon
API připravené pro produkci vyžaduje víc než jen operace CRUD. Vyžaduje robustní zabezpečení a pochopení event loopu v Node.js.
Model oprávnění v Node.js
Jedním z nejzajímavějších přírůstků v Node.js 22 je experimentální model oprávnění. Nyní můžete omezit přístup vašeho API k prostředí. Například:
node --experimental-permission --allow-fs-read=/tmp/ --allow-net=api.stripe.com server.js
To zajistí, že i když je nějaká závislost kompromitována, útočník nemůže přečíst váš soubor /etc/passwd nebo odeslat data na škodlivou doménu.
Zpracování náročných výpočtů
Node.js je jednovláknové. Pokud vaše API potřebuje zpracovávat velké obrázky nebo generovat složitá PDF, zablokuje to event loop, což zabrání vyřízení ostatních požadavků.
- Řešení: Použijte Worker Threads pro úlohy náročné na CPU nebo je přesuňte na background workera, jako je BullMQ s využitím Redis. To udrží vaše REST API responzivní.
Bezpečnostní hlavičky a sanitizace
Vždy používejte Helmet.js pro nastavení bezpečných HTTP hlaviček. Ve výchozím nastavení chrání před běžnými zranitelnostmi, jako je Cross-Site Scripting (XSS) a clickjacking.
import helmet from 'helmet';
const app = express();
app.use(helmet()); // Nastaví 15+ bezpečnostních hlaviček
Scénář z reálného světa: Implementace pokročilého filtrování
Moderní API často potřebují podporovat složité dotazování. Místo psaní vlastní logiky pro každou routu můžeme vytvořit znovupoužitelný nástroj "Query Features".
class APIFeatures {
constructor(query, queryString) {
this.query = query; // Dotaz Prisma nebo Mongoose
this.queryString = queryString; // req.query
}
filter() {
const queryObj = { ...this.queryString };
const excludedFields = ['page', 'sort', 'limit', 'fields'];
excludedFields.forEach(el => delete queryObj[el]);
// Pokročilé filtrování (např. price[gte]=500)
let queryStr = JSON.stringify(queryObj);
queryStr = queryStr.replace(/\b(gte|gt|lte|lt)\b/g, match => `$${match}`);
this.query = this.query.find(JSON.parse(queryStr));
return this;
}
paginate() {
const page = this.queryString.page * 1 || 1;
const limit = this.queryString.limit * 1 || 100;
const skip = (page - 1) * limit;
this.query = this.query.skip(skip).limit(limit);
return this;
}
}To vám umožní obsloužit požadavky jako GET /api/products?price[gte]=100&page=2&limit=20 pomocí několika řádků kódu ve vaší servisní vrstvě.
Nezbytné nástroje pro rok 2025
| Nástroj | Účel | Proč je nezbytný |
|---|---|---|
| Prisma | ORM | Poskytuje plnou typovou bezpečnost pro vaše databázové schéma. |
| PM2 | Správa procesů | Zajišťuje clustering pro využití všech jader CPU a restarty bez výpadků. |
| Swagger UI | Dokumentace | Automaticky generuje interaktivní dokumentaci API z vaší specifikace OpenAPI 3.1. |
| Winston | Logování | Strukturované JSON logování je vyžadováno pro moderní nástroje observability jako Datadog. |
Často kladené otázky
Jak od základu vytvořit RESTful API s Node.js a Express?
Chcete-li vytvořit API od nuly, inicializujte projekt Node.js pomocí npm init, nainstalujte Express a vytvořte vstupní soubor. Poté definujte routy pomocí app.get(), app.post() atd. a použijte middleware pro parsování JSON a zpracování chyb.
Jaký je rozdíl mezi Node.js a Express.js při vývoji API?
Node.js je JavaScriptové runtime prostředí, které umožňuje spouštět kód na serveru, zatímco Express.js je minimalistický webový framework postavený nad Node.js. Node.js poskytuje základní síťové schopnosti, zatímco Express zjednodušuje směrování, integraci middleware a zpracování požadavků.
Jak řešit autentizaci a autorizaci v Node.js REST API?
Autentizace se obvykle řeší pomocí JSON Web Tokens (JWT) nebo session cookies prostřednictvím middleware, jako je Passport.js, nebo vlastní logiky. Autorizace se implementuje kontrolou role nebo oprávnění uživatele (získaných z tokenu) proti požadavkům konkrétní routy.
Jaké jsou osvědčené postupy pro strukturování projektu Node.js Express?
Nejlepším postupem je použití vrstvené architektury, kdy kód rozdělíte do složek pro Kontrolery, Služby, Modely (DAL) a Middleware. Toto oddělení zájmů zajišťuje, že byznys logika je izolována od HTTP transportní vrstvy, což usnadňuje testování a údržbu codebase.
Jak připojit Node.js REST API k databázi MongoDB?
K MongoDB se připojíte pomocí oficiálního ovladače MongoDB nebo ODM jako Mongoose. Vytvoříte připojovací řetězec v proměnných prostředí a použijete vzor singleton, abyste zajistili, že připojení k databázi bude sdíleno napříč servisní vrstvou vaší aplikace.
Závěr
Budování REST API s Node.js a Express dozrálo v sofistikovanou disciplínu. Vydání Express 5.0 znamená bod obratu, kdy jsou asynchronní vzory konečně prvořadými občany, což výrazně snižuje množství boilerplate kódu a chybovost. Kombinací tohoto s nativními funkcemi Node.js 22 – jako je model oprávnění a fetch API – a striktní třívrstvou architekturou mohou vývojáři stavět systémy, které jsou nejen výkonné, ale také odolné a bezpečné.
Při dalším postupu upřednostňujte návrh "contract-first" s OpenAPI a validaci za běhu pomocí Zod. Tyto nástroje zajistí, že i když vaše API poroste, zůstane spolehlivým kontraktem pro vaše frontendové a mobilní spotřebitele. "Cesta Expressu" v roce 2025 je o tom dělat více s méně prostředky: méně závislostí, více nativních funkcí a čistší, typově bezpečný kód.