← Wszystkie posty9 min czytania

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

Marcin Siwonia
Marcin Siwonia

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

Pogadajmy

Masz pytanie? Napisz.

Kontakt