Slovenčina

Komplexný sprievodca Server Actions v Next.js 14, ktorý pokrýva osvedčené postupy, validáciu dát, bezpečnosť a pokročilé techniky pre moderné webové aplikácie.

Server Actions v Next.js 14: Zvládnutie osvedčených postupov pri spracovaní formulárov

Next.js 14 prináša výkonné funkcie na vytváranie výkonných a používateľsky prívetivých webových aplikácií. Medzi nimi vynikajú Server Actions ako transformačný spôsob spracovania odoslaných formulárov a dátových mutácií priamo na serveri. Tento sprievodca poskytuje komplexný prehľad Server Actions v Next.js 14 so zameraním na osvedčené postupy pri spracovaní formulárov, validácii dát, bezpečnosti a pokročilých technikách. Preskúmame praktické príklady a poskytneme užitočné poznatky, ktoré vám pomôžu vytvárať robustné a škálovateľné webové aplikácie.

Čo sú Next.js Server Actions?

Server Actions sú asynchrónne funkcie, ktoré bežia na serveri a môžu byť volané priamo z React komponentov. Eliminujú potrebu tradičných API ciest pre spracovanie odoslaných formulárov a dátových mutácií, čo vedie k zjednodušenému kódu, zlepšenej bezpečnosti a zvýšenému výkonu. Server Actions sú React Server Components (RSC), čo znamená, že sa vykonávajú na serveri, čo vedie k rýchlejšiemu počiatočnému načítaniu stránok a lepšiemu SEO.

Kľúčové výhody Server Actions:

Nastavenie vášho Next.js 14 projektu

Predtým, ako sa ponoríme do Server Actions, uistite sa, že máte nastavený projekt Next.js 14. Ak začínate od nuly, vytvorte nový projekt pomocou nasledujúceho príkazu:

npx create-next-app@latest my-next-app

Uistite sa, že váš projekt používa adresárovú štruktúru app, aby ste mohli plne využiť Server Components a Actions.

Základné spracovanie formulárov so Server Actions

Začnime jednoduchým príkladom: formulár, ktorý odosiela dáta na vytvorenie novej položky v databáze. Použijeme jednoduchý formulár s jedným vstupným poľom a tlačidlom na odoslanie.

Príklad: Vytvorenie novej položky

Najprv definujte funkciu Server Action vo vašom React komponente. Táto funkcia bude spracovávať logiku odoslania formulára на serveri.

// app/components/CreateItemForm.tsx
'use client';

import { useState } from 'react';

async function createItem(formData: FormData) {
  'use server'

  const name = formData.get('name') as string;

  // Simulácia interakcie s databázou
  console.log('Vytvára sa položka:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulácia latencie

  console.log('Položka úspešne vytvorená!');
}

export default function CreateItemForm() {
  const [isSubmitting, setIsSubmitting] = useState(false);
  
  async function handleSubmit(formData: FormData) {
    setIsSubmitting(true);
    await createItem(formData);
    setIsSubmitting(false);
  }

  return (
    
); }

Vysvetlenie:

Validácia dát

Validácia dát je kľúčová pre zabezpečenie integrity dát a predchádzanie bezpečnostným zraniteľnostiam. Server Actions poskytujú vynikajúcu príležitosť na vykonanie validácie na strane servera. Tento prístup pomáha zmierniť riziká spojené s validáciou iba na strane klienta.

Príklad: Validácia vstupných dát

Upravte Server Action createItem tak, aby obsahovala validačnú logiku.

// app/components/CreateItemForm.tsx
'use client';

import { useState } from 'react';

async function createItem(formData: FormData) {
  'use server'

  const name = formData.get('name') as string;

  if (!name || name.length < 3) {
    throw new Error('Názov položky musí mať aspoň 3 znaky.');
  }

  // Simulácia interakcie s databázou
  console.log('Vytvára sa položka:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulácia latencie

  console.log('Položka úspešne vytvorená!');
}

export default function CreateItemForm() {
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [errorMessage, setErrorMessage] = useState(null);
  
  async function handleSubmit(formData: FormData) {
    setIsSubmitting(true);
    setErrorMessage(null);
    try {
      await createItem(formData);
    } catch (error: any) {
      setErrorMessage(error.message || 'Vyskytla sa chyba.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Vysvetlenie:

Použitie validačných knižníc

Pre zložitejšie validačné scenáre zvážte použitie validačných knižníc ako:

Tu je príklad s použitím Zod:

// app/utils/validation.ts
import { z } from 'zod';

export const CreateItemSchema = z.object({
  name: z.string().min(3, 'Názov položky musí mať aspoň 3 znaky.'),
});
// app/components/CreateItemForm.tsx
'use client';

import { useState } from 'react';
import { CreateItemSchema } from '../utils/validation';

async function createItem(formData: FormData) {
  'use server'

  const name = formData.get('name') as string;

  const validatedFields = CreateItemSchema.safeParse({ name });

  if (!validatedFields.success) {
    return { errors: validatedFields.error.flatten().fieldErrors };
  }

  // Simulácia interakcie s databázou
  console.log('Vytvára sa položka:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulácia latencie

  console.log('Položka úspešne vytvorená!');
}

export default function CreateItemForm() {
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [errorMessage, setErrorMessage] = useState(null);
  
  async function handleSubmit(formData: FormData) {
    setIsSubmitting(true);
    setErrorMessage(null);
    try {
      await createItem(formData);
    } catch (error: any) {
      setErrorMessage(error.message || 'Vyskytla sa chyba.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Vysvetlenie:

Bezpečnostné aspekty

Server Actions zvyšujú bezpečnosť spúšťaním kódu na serveri, ale stále je kľúčové dodržiavať osvedčené bezpečnostné postupy na ochranu vašej aplikácie pred bežnými hrozbami.

Prevencia Cross-Site Request Forgery (CSRF)

CSRF útoky zneužívajú dôveru, ktorú má webová stránka v prehliadači používateľa. Na predchádzanie CSRF útokom implementujte mechanizmy ochrany proti CSRF.

Next.js automaticky zabezpečuje ochranu proti CSRF pri používaní Server Actions. Framework generuje a validuje CSRF token pre každé odoslanie formulára, čím zaisťuje, že požiadavka pochádza z vašej aplikácie.

Spracovanie autentifikácie a autorizácie používateľov

Zabezpečte, aby len autorizovaní používatelia mohli vykonávať určité akcie. Implementujte mechanizmy autentifikácie a autorizácie na ochranu citlivých dát a funkcionality.

Tu je príklad použitia NextAuth.js na ochranu Server Action:

// app/components/CreateItemForm.tsx
'use client';

import { useState } from 'react';
import { getServerSession } from 'next-auth';
import { authOptions } from '../../app/api/auth/[...nextauth]/route';

async function createItem(formData: FormData) {
  'use server'

  const session = await getServerSession(authOptions);

  if (!session) {
    throw new Error('Neautorizovaný prístup');
  }

  const name = formData.get('name') as string;

  // Simulácia interakcie s databázou
  console.log('Vytvára sa položka:', name, 'používateľom:', session.user?.email);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulácia latencie

  console.log('Položka úspešne vytvorená!');
}

export default function CreateItemForm() {
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [errorMessage, setErrorMessage] = useState(null);
  
  async function handleSubmit(formData: FormData) {
    setIsSubmitting(true);
    setErrorMessage(null);
    try {
      await createItem(formData);
    } catch (error: any) {
      setErrorMessage(error.message || 'Vyskytla sa chyba.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Vysvetlenie:

Ošetrenie vstupných dát

Ošetrite vstupné dáta, aby ste predišli útokom Cross-Site Scripting (XSS). Útoky XSS nastávajú, keď je do webovej stránky vložený škodlivý kód, čo môže potenciálne ohroziť dáta používateľov alebo funkčnosť aplikácie.

Použite knižnice ako DOMPurify alebo sanitize-html na ošetrenie vstupov poskytnutých používateľom pred ich spracovaním vo vašich Server Actions.

Pokročilé techniky

Teraz, keď sme si prešli základy, pozrime sa na niektoré pokročilé techniky pre efektívne používanie Server Actions.

Optimistické aktualizácie

Optimistické aktualizácie poskytujú lepší používateľský zážitok okamžitou aktualizáciou UI, akoby akcia bola úspešná, ešte predtým, ako ju server potvrdí. Ak akcia na serveri zlyhá, UI sa vráti do pôvodného stavu.

// app/components/UpdateItemForm.tsx
'use client';

import { useState } from 'react';

async function updateItem(id: string, formData: FormData) {
  'use server'

  const name = formData.get('name') as string;

  // Simulácia interakcie s databázou
  console.log('Aktualizuje sa položka:', id, 's názvom:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulácia latencie

  // Simulácia zlyhania (pre demonštračné účely)
  const shouldFail = Math.random() < 0.5;
  if (shouldFail) {
    throw new Error('Nepodarilo sa aktualizovať položku.');
  }

  console.log('Položka úspešne aktualizovaná!');
  return { name }; // Vráti aktualizovaný názov
}

export default function UpdateItemForm({ id, initialName }: { id: string; initialName: string }) {
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [errorMessage, setErrorMessage] = useState(null);
  const [itemName, setItemName] = useState(initialName);

  async function handleSubmit(formData: FormData) {
    setIsSubmitting(true);
    setErrorMessage(null);

    // Optimisticky aktualizovať UI
    const newName = formData.get('name') as string;
    setItemName(newName);

    try {
      const result = await updateItem(id, formData);
      // Ak je úspešná, aktualizácia je už premietnutá v UI cez setItemName

    } catch (error: any) {
      setErrorMessage(error.message || 'Vyskytla sa chyba.');
      // Vrátiť UI do pôvodného stavu pri chybe
      setItemName(initialName);
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    

Aktuálny názov: {itemName}

{errorMessage &&

{errorMessage}

}
); }

Vysvetlenie:

Revalidácia dát

Po tom, ako Server Action zmení dáta, možno budete potrebovať revalidovať kešované dáta, aby sa zabezpečilo, že UI odráža najnovšie zmeny. Next.js poskytuje niekoľko spôsobov revalidácie dát:

Tu je príklad revalidácie cesty po vytvorení novej položky:

// app/components/CreateItemForm.tsx
'use client';

import { useState } from 'react';
import { revalidatePath } from 'next/cache';

async function createItem(formData: FormData) {
  'use server'

  const name = formData.get('name') as string;

  // Simulácia interakcie s databázou
  console.log('Vytvára sa položka:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulácia latencie

  console.log('Položka úspešne vytvorená!');

  revalidatePath('/items'); // Revalidovať cestu /items
}

export default function CreateItemForm() {
  const [isSubmitting, setIsSubmitting] = useState(false);
  const [errorMessage, setErrorMessage] = useState(null);
  
  async function handleSubmit(formData: FormData) {
    setIsSubmitting(true);
    setErrorMessage(null);
    try {
      await createItem(formData);
    } catch (error: any) {
      setErrorMessage(error.message || 'Vyskytla sa chyba.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Vysvetlenie:

Osvedčené postupy pre Server Actions

Aby ste maximalizovali výhody Server Actions, zvážte nasledujúce osvedčené postupy:

Bežné nástrahy a ako sa im vyhnúť

Hoci Server Actions ponúkajú množstvo výhod, existujú niektoré bežné nástrahy, na ktoré si treba dať pozor:

Záver

Server Actions v Next.js 14 poskytujú výkonný a efektívny spôsob spracovania odoslaných formulárov a mutácií dát priamo na serveri. Dodržiavaním osvedčených postupov uvedených v tomto sprievodcovi môžete vytvárať robustné, bezpečné a výkonné webové aplikácie. Osvojte si Server Actions, aby ste zjednodušili svoj kód, zvýšili bezpečnosť a zlepšili celkový používateľský zážitok. Pri integrácii týchto princípov zvážte globálny dopad vašich vývojových rozhodnutí. Zabezpečte, aby vaše formuláre a procesy spracovania dát boli prístupné, bezpečné a používateľsky prívetivé pre rôznorodé medzinárodné publikum. Tento záväzok k inkluzivite nielen zlepší použiteľnosť vašej aplikácie, ale aj rozšíri jej dosah a efektivitu v globálnom meradle.