Magyar

Átfogó útmutató a Next.js 14 Szerver Akciókhoz, amely bemutatja az űrlapkezelés legjobb gyakorlatait, az adatvalidálást, a biztonsági szempontokat és a modern webalkalmazások építésének haladó technikáit.

Next.js 14 Szerver Akciók: Bevált gyakorlatok űrlapkezeléshez

A Next.js 14 hatékony funkciókat vezet be a nagy teljesítményű és felhasználóbarát webalkalmazások készítéséhez. Ezek közül kiemelkednek a Szerver Akciók (Server Actions), mint az űrlapküldések és adatmutációk közvetlenül a szerveren történő kezelésének átalakító erejű módja. Ez az útmutató átfogó áttekintést nyújt a Next.js 14 Szerver Akciókról, a legjobb űrlapkezelési gyakorlatokra, az adatvalidálásra, a biztonságra és a haladó technikákra összpontosítva. Gyakorlati példákat tárunk fel, és azonnal hasznosítható ismereteket adunk, hogy segítsünk Önnek robusztus és skálázható webalkalmazásokat építeni.

Mik azok a Next.js Szerver Akciók?

A Szerver Akciók aszinkron funkciók, amelyek a szerveren futnak, és közvetlenül a React komponensekből hívhatók meg. Kiküszöbölik a hagyományos API útvonalak szükségességét az űrlapküldések és adatmutációk kezeléséhez, ami egyszerűbb kódot, jobb biztonságot és megnövelt teljesítményt eredményez. A Szerver Akciók React Szerver Komponensek (RSC-k), ami azt jelenti, hogy a szerveren hajtódnak végre, gyorsabb kezdeti oldalbetöltést és jobb SEO-t eredményezve.

A Szerver Akciók legfőbb előnyei:

A Next.js 14 projekt beállítása

Mielőtt belevágnánk a Szerver Akciókba, győződjön meg róla, hogy be van állítva egy Next.js 14 projekt. Ha a nulláról kezdi, hozzon létre egy új projektet a következő paranccsal:

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

Győződjön meg róla, hogy a projektje az app könyvtárstruktúrát használja, hogy teljes mértékben kihasználhassa a Szerver Komponenseket és Akciókat.

Alapvető űrlapkezelés Szerver Akciókkal

Kezdjük egy egyszerű példával: egy űrlap, amely adatokat küld egy új elem létrehozásához egy adatbázisban. Egy egyszerű űrlapot fogunk használni egy beviteli mezővel és egy küldés gombbal.

Példa: Új elem létrehozása

Először definiáljon egy Szerver Akció funkciót a React komponensen belül. Ez a funkció fogja kezelni az űrlapküldési logikát a szerveren.

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

import { useState } from 'react';

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

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

  // Adatbázis-interakció szimulálása
  console.log('Creating item:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Késleltetés szimulálása

  console.log('Item created successfully!'); // Elem sikeresen létrehozva!
}

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

  return (
    
); }

Magyarázat:

Adatvalidálás

Az adatvalidálás kulcsfontosságú az adatintegritás biztosításához és a biztonsági rések megelőzéséhez. A Szerver Akciók kiváló lehetőséget nyújtanak a szerveroldali validálás elvégzésére. Ez a megközelítés segít csökkenteni a kizárólag kliensoldali validálással járó kockázatokat.

Példa: Bemeneti adatok validálása

Módosítsa a createItem Szerver Akciót, hogy tartalmazzon validációs logikát.

// 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('Az elem nevének legalább 3 karakter hosszúnak kell lennie.');
  }

  // Adatbázis-interakció szimulálása
  console.log('Creating item:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Késleltetés szimulálása

  console.log('Item created successfully!'); // Elem sikeresen létrehozva!
}

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 || 'Hiba történt.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Magyarázat:

Validációs könyvtárak használata

Bonyolultabb validációs esetekhez fontolja meg validációs könyvtárak használatát, mint például:

Itt egy példa a Zod használatára:

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

export const CreateItemSchema = z.object({
  name: z.string().min(3, 'Az elem nevének legalább 3 karakter hosszúnak kell lennie.'),
});
// 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 };
  }

  // Adatbázis-interakció szimulálása
  console.log('Creating item:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Késleltetés szimulálása

  console.log('Item created successfully!'); // Elem sikeresen létrehozva!
}

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 || 'Hiba történt.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Magyarázat:

Biztonsági szempontok

A Szerver Akciók növelik a biztonságot azáltal, hogy a kódot a szerveren hajtják végre, de továbbra is kulcsfontosságú a biztonsági legjobb gyakorlatok követése az alkalmazás védelme érdekében a gyakori fenyegetésekkel szemben.

Cross-Site Request Forgery (CSRF) megelőzése

A CSRF támadások kihasználják azt a bizalmat, amellyel egy weboldal a felhasználó böngészője iránt viseltetik. A CSRF támadások megelőzése érdekében implementáljon CSRF védelmi mechanizmusokat.

A Next.js automatikusan kezeli a CSRF védelmet a Szerver Akciók használatakor. A keretrendszer minden űrlapküldéshez generál és validál egy CSRF tokent, biztosítva, hogy a kérés az Ön alkalmazásából származzon.

Felhasználói hitelesítés és jogosultságkezelés

Biztosítsa, hogy csak jogosult felhasználók végezhessenek el bizonyos műveleteket. Implementáljon hitelesítési és jogosultságkezelési mechanizmusokat az érzékeny adatok és funkcionalitás védelme érdekében.

Itt egy példa a NextAuth.js használatára egy Szerver Akció védelméhez:

// 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('Jogosulatlan');
  }

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

  // Adatbázis-interakció szimulálása
  console.log('Creating item:', name, 'by user:', session.user?.email);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Késleltetés szimulálása

  console.log('Item created successfully!'); // Elem sikeresen létrehozva!
}

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 || 'Hiba történt.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Magyarázat:

Bemeneti adatok tisztítása (Sanitizing)

Tisztítsa meg a bemeneti adatokat a Cross-Site Scripting (XSS) támadások megelőzése érdekében. Az XSS támadások akkor fordulnak elő, amikor rosszindulatú kódot injektálnak egy weboldalba, ami potenciálisan veszélyeztetheti a felhasználói adatokat vagy az alkalmazás funkcionalitását.

Használjon olyan könyvtárakat, mint a DOMPurify vagy a sanitize-html a felhasználó által megadott bemeneti adatok tisztítására, mielőtt feldolgozná őket a Szerver Akciókban.

Haladó technikák

Most, hogy áttekintettük az alapokat, nézzünk meg néhány haladó technikát a Szerver Akciók hatékony használatához.

Optimista frissítések

Az optimista frissítések jobb felhasználói élményt nyújtanak azáltal, hogy azonnal frissítik a felhasználói felületet, mintha a művelet sikeres lenne, még mielőtt a szerver ezt megerősítené. Ha a művelet a szerveren meghiúsul, a felhasználói felület visszaáll az előző állapotába.

// 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;

  // Adatbázis-interakció szimulálása
  console.log('Updating item:', id, 'with name:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Késleltetés szimulálása

  // Hiba szimulálása (demonstrációs célból)
  const shouldFail = Math.random() < 0.5;
  if (shouldFail) {
    throw new Error('Az elem frissítése sikertelen.');
  }

  console.log('Item updated successfully!');
  return { name }; // Visszaadja a frissített nevet
}

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);

    // A UI optimista frissítése
    const newName = formData.get('name') as string;
    setItemName(newName);

    try {
      const result = await updateItem(id, formData);
      //Siker esetén a frissítés már látható a UI-on a setItemName által

    } catch (error: any) {
      setErrorMessage(error.message || 'Hiba történt.');
      // Hiba esetén a UI visszaállítása
      setItemName(initialName);
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    

Jelenlegi név: {itemName}

{errorMessage &&

{errorMessage}

}
); }

Magyarázat:

Adatok újraérvényesítése (Revalidating)

Miután egy Szerver Akció módosítja az adatokat, szükség lehet a gyorsítótárazott adatok újraérvényesítésére, hogy a felhasználói felület a legfrissebb változásokat tükrözze. A Next.js többféle módot kínál az adatok újraérvényesítésére:

Itt egy példa egy útvonal újraérvényesítésére egy új elem létrehozása után:

// 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;

  // Adatbázis-interakció szimulálása
  console.log('Creating item:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Késleltetés szimulálása

  console.log('Item created successfully!');

  revalidatePath('/items'); // Az /items útvonal újraérvényesítése
}

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 || 'Hiba történt.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Magyarázat:

Bevált gyakorlatok Szerver Akciókhoz

A Szerver Akciók előnyeinek maximalizálása érdekében vegye figyelembe a következő bevált gyakorlatokat:

Gyakori buktatók és elkerülésük

Bár a Szerver Akciók számos előnnyel járnak, van néhány gyakori buktató, amire érdemes odafigyelni:

Összegzés

A Next.js 14 Szerver Akciók hatékony és eredményes módot kínálnak az űrlapküldések és adatmutációk közvetlen szerveroldali kezelésére. Az ebben az útmutatóban vázolt legjobb gyakorlatok követésével robusztus, biztonságos és nagy teljesítményű webalkalmazásokat építhet. Használja ki a Szerver Akciókat a kód egyszerűsítésére, a biztonság növelésére és az általános felhasználói élmény javítására. Ahogy integrálja ezeket az elveket, vegye figyelembe fejlesztési döntéseinek globális hatását. Biztosítsa, hogy űrlapjai és adatkezelési folyamatai hozzáférhetők, biztonságosak és felhasználóbarátok legyenek a különböző nemzetközi közönségek számára. Ez az inkluzivitás iránti elkötelezettség nemcsak az alkalmazás használhatóságát javítja, hanem globális szinten is kiszélesíti annak elérhetőségét és hatékonyságát.