Post · 27
Server Actions w Next.js — co to i jak używać w 2026
Server Actions to async funkcje wykonywane na serwerze, wywoływane bezpośrednio z komponentów React (server lub client) bez tworzenia osobnych API routes. Dostępne w Next.js 13.4+ jako stable, w 2026 standard dla mutations (form submissions, database writes, third-party API calls). Stack którego używam w każdym projekcie tworzenia stron Next.js. Niżej jak działa, kiedy używać, jak zabezpieczyć i typowe błędy.
- Next.js
- Server Actions
- React
Co to są Server Actions technicznie
Server Action to async funkcja JavaScript / TypeScript oznaczona dyrektywą `'use server'`. Wykonuje się ZAWSZE na serwerze (Node.js runtime lub Edge), nigdy w przeglądarce. Można ją wywołać z dowolnego komponentu React.
Pod spodem Next.js generuje endpoint POST z unikalnym ID dla każdej Server Action, zarządza serializacją argumentów (z React → JSON → server), deserializacją odpowiedzi (server → JSON → React state), revalidation cache (`revalidatePath`, `revalidateTag`).
Z punktu widzenia developera: piszesz funkcję jakby była lokalna, ale wszystko po stronie HTTP zostaje obsłużone automatycznie. Type safety end-to-end (jeśli używasz TypeScript), argumenty i return type są takie same po obu stronach.
Server Actions ZAWSZE są POST requestami. Nie używaj ich do GET / read operations, do tego są React Server Components (które renderują dane przy SSR/SSG bez round-trip).
Kiedy używać Server Actions
**Form submissions**: najbardziej oczywisty use case. Form akcja `<form action={mojaServerAction}>` wywołuje akcję z FormData jako argumentem. Bez API route, bez fetch, bez state management dla loading. Tak działa formularz kontaktowy na marcinsiwonia.pl, Server Action wysyła mail przez Resend.
**Database mutations**: INSERT / UPDATE / DELETE. Wywołujesz Prisma / Drizzle / raw SQL bezpośrednio w Server Action, bez tworzenia REST endpoint. Standard w tworzeniu aplikacji Next.js z bazą Postgres.
**Third-party API calls wymagające secret keys**: wysyłka maila przez Resend/SendGrid, płatność przez Stripe API, integracja z CRM. Klucze API w server-only env vars, nigdy nie wyciekną do bundle. Dla integracji bardziej złożonych: Next.js software house.
**Cache invalidation**: po mutation `revalidatePath('/products')` lub `revalidateTag('products')` automatycznie odświeża strony statyczne ISR.
**Optimistic updates**: z `useOptimistic` hook React 19 robisz natychmiastowy update UI + Server Action w tle. User widzi zmianę instant, nie czeka na network.
Kiedy NIE używać Server Actions
**Read-only operations**: to robota React Server Components (komponenty async fetchują dane przy SSR). Server Action dla GET = zła praktyka, marnuje round-trip. Pełny przewodnik strategii renderowania: Server-Side Rendering: co to i kiedy używać.
**Public API dla third-party** (Twoja aplikacja jest backendem dla cudzych frontendów), Server Actions to internal API Next.js, nie REST. Wystaw klasyczne API routes (`app/api/.../route.ts`).
**Long-running tasks** (reportgen, video processing), Server Action ma timeout 10s na Vercel free, 60s na Pro. Dla długich tasków: queue (Inngest, Trigger.dev, BullMQ) + webhook po zakończeniu.
**Streaming responses** (chat z AI, large data download), Server Actions zwracają jeden response. Dla streaming: API routes z `Response` body jako stream.
**Mutations wymagające specific HTTP method** (PUT, DELETE, PATCH) z third-party tooling, Server Actions to zawsze POST. Dla compliance z REST conventions: API routes.
Walidacja i security
**ZAWSZE waliduj argumenty na serwerze.** Klient może wysłać dowolne dane. Użyj Zod / Valibot / Yup do schema validation:
Przykład: `const schema = z.object({ email: z.string().email(), name: z.string().min(2) });` na początku Server Action, potem `schema.parse(data)`, rzuci wyjątek jeśli dane niepoprawne.
**Sprawdź autoryzację.** Server Action nie ma automatycznego auth check. W każdej akcji wymagającej autoryzacji: `const session = await auth();` na początku, throw error jeśli brak.
**Rate limiting.** Server Action dostępne dla każdego użytkownika, można je spamować. Użyj Upstash Ratelimit lub własny rate limit (Redis, in-memory dla małych projektów).
**CSRF protection**: Next.js automatycznie chroni Server Actions przez Origin header check (od 14.1+). Możesz dodać własny token jeśli wymagasz extra warstwy.
**Nigdy nie używaj userInput w SQL bez parametryzacji.** Prisma / Drizzle / `$queryRaw` z placeholders, ZAWSZE. Inaczej SQL injection.
Patterny które używam najczęściej
**Form action z FormData**: najprostszy pattern. `<form action={createUser}>`, w akcji `const name = formData.get('name')`. Działa nawet bez JavaScript (progressive enhancement).
**Form action z React 19 useFormState**: dla server-side form errors widocznych dla usera. `const [state, action] = useFormState(createUser, { error: null })`. Renderujesz `state.error` w komponencie.
**Optimistic update z useOptimistic**: dla UX gdzie ważna jest natychmiastowa odpowiedź. `addOptimistic(newItem)` przed Server Action, jeśli się nie powiedzie, rollback z error message.
**Server Action wywołana z client component**: nie tylko z `<form action>`. Możesz wywołać jak normalną funkcję: `<button onClick={() => deleteItem(id)}>`. Server Action wykona się po POST.
**Revalidation po mutation**: `revalidatePath('/products')` w Server Action, automatycznie odświeża cache dla tej ścieżki. Dla wszystkich stron z określonym tagiem: `revalidateTag('products')` + `fetch(..., { next: { tags: ['products'] }})` przy fetchu.
FAQ
Najczęstsze pytania.
- Czy Server Actions zastępują API routes?
- Częściowo. Server Actions = mutations używane wewnątrz Twojej aplikacji Next.js. API routes = public endpoints dla third-party / mobile apps / non-Next.js consumerów. Większość internal mutations w 2026 = Server Actions.
- Czy Server Actions działają bez JavaScript?
- Tak, jeśli wywołane z `<form action>` (progressive enhancement). Form submituje się klasycznym POST + reload. Z `<button onClick>` lub fetch-em wymagają JS.
- Jak debugować Server Actions?
- Console.log w Server Action loguje na serwerze (terminal w dev, logs w Vercel dashboard w produkcji). Errors propagują do client jeśli `throw`, łapiesz w `useFormState` lub try/catch.
- Czy mogę wywołać Server Action z innej Server Action?
- Tak, to zwykła async funkcja na serwerze. Możesz też importować i wywoływać Server Action z React Server Component przy SSR.
- Jak ograniczyć rate Server Actions?
- Upstash Ratelimit (Redis-based, free tier wystarcza dla większości projektów), lub własny in-memory rate limit dla low-traffic. Sprawdź IP / user ID na początku akcji, throw jeśli przekroczony limit.
- Czy Server Actions działają na Edge runtime?
- Tak, `export const runtime = 'edge'` w pliku z Server Action. Edge ma niższe latency ale ograniczone API (brak Node.js libs które wymagają Node runtime, np. Prisma standard). Dla większości CRUD operations OK.
Autor
Programista z Wrocławia. Od 2020 roku tworzę strony i aplikacje internetowe, od końca 2022 na własny rachunek. Ponad 30 wdrożeń komercyjnych dla firm z Polski i Niemiec, głównie WordPress, WooCommerce i Next.js.
Powiązane usługi
Usługa
Tworzenie stron Next.js
Strony Next.js dla firm, które chcą najszybszej technologii webowej dostępnej w 2026 roku. Statyczny HTML z serwerów edge, server components, pierwsze wyświetlenie poniżej 200 ms niezależnie od tego, skąd wchodzi użytkownik. Next.js wybiera się, gdy zależy Ci na wydajności, dopracowanym wizerunku, integracjach z API albo własnym panelu pod stroną. Wtedy wyższy koszt produkcji się broni.
Zobacz→Usługa
Next.js software house
Robię to, co software house, tylko sam. Z Twojego briefu powstaje aplikacja Next.js w 4-12 tygodni. Bez project managera pośrodku, bez 30% marży agencji i bez przekazywania projektu między czterema osobami. Komunikacja bezpośrednia, decyzje od ręki.
Zobacz→Usługa
Aplikacje React
React jest świetny, gdy aplikacja działa za logowaniem albo nie ma wymagań SEO. Mniej narzutu Next.js, mniej kosztu hostingu, mniej decyzji do podjęcia po stronie infrastruktury.
Zobacz→
Pogadajmy
Masz pytanie? Napisz.
Kontakt→← Poprzedni
25 must-have wtyczek WordPress 2026 — kompletna lista
Następny →
Dostępność WooCommerce: błędy WCAG w 110 polskich sklepach