Eesti

Põhjalik juhend Next.js 14 Server Actions kohta, mis käsitleb vormide käsitlemise parimaid tavasid, andmete valideerimist, turvakaalutlusi ja kaasaegsete veebirakenduste loomise täiustatud tehnikaid.

Next.js 14 Server Actions: Vormide käsitlemise parimate tavade valdamine

Next.js 14 toob endaga kaasa võimsad funktsioonid jõudluspõhiste ja kasutajasõbralike veebirakenduste loomiseks. Nende hulgas paistavad Server Actions silma kui transformatiivne viis vormide esitamise ja andmemuutuste käsitlemiseks otse serveris. See juhend pakub põhjalikku ülevaadet Server Actions'itest Next.js 14-s, keskendudes vormide käsitlemise parimatele tavadele, andmete valideerimisele, turvalisusele ja täiustatud tehnikatele. Uurime praktilisi näiteid ja pakume rakendatavaid teadmisi, mis aitavad teil luua robustseid ja skaleeritavaid veebirakendusi.

Mis on Next.js Server Actions?

Server Actions on asünkroonsed funktsioonid, mis käivitatakse serveris ja mida saab otse Reacti komponentidest välja kutsuda. Need kaotavad vajaduse traditsiooniliste API-marsruutide järele vormide esitamise ja andmemuutuste käsitlemiseks, mille tulemuseks on lihtsustatud kood, parem turvalisus ja suurem jõudlus. Server Actions on React Server Components (RSC), mis tähendab, et need käivitatakse serveris, tagades kiiremad esialgsed lehe laadimised ja parema SEO.

Server Actions'i peamised eelised:

Next.js 14 projekti seadistamine

Enne Server Actions'itesse süvenemist veenduge, et teil on Next.js 14 projekt seadistatud. Kui alustate nullist, looge uus projekt järgmise käsuga:

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

Veenduge, et teie projekt kasutab app kaustastruktuuri, et täielikult ära kasutada Server Components'i ja Actions'i võimalusi.

Põhiline vormide käsitlemine Server Actions'iga

Alustame lihtsa näitega: vorm, mis esitab andmeid uue elemendi loomiseks andmebaasis. Kasutame lihtsat vormi sisestusvälja ja esitamisnupuga.

Näide: Uue elemendi loomine

Esmalt defineerige Server Action funktsioon oma Reacti komponendis. See funktsioon tegeleb vormi esitamise loogikaga serveris.

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

import { useState } from 'react';

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

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

  // Simuleeri andmebaasi interaktsiooni
  console.log('Loon elementi:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simuleeri latentsust

  console.log('Element edukalt loodud!');
}

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

  return (
    
); }

Selgitus:

Andmete valideerimine

Andmete valideerimine on andmete terviklikkuse tagamiseks ja turvanõrkuste ennetamiseks ülioluline. Server Actions pakub suurepärast võimalust serveripoolse valideerimise teostamiseks. See lähenemine aitab maandada riske, mis on seotud ainult kliendipoolse valideerimisega.

Näide: Sisendandmete valideerimine

Muutke createItem Server Action'it, et lisada valideerimisloogika.

// 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('Elemendi nimi peab olema vähemalt 3 tähemärki pikk.');
  }

  // Simuleeri andmebaasi interaktsiooni
  console.log('Loon elementi:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simuleeri latentsust

  console.log('Element edukalt loodud!');
}

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 || 'Tekkis viga.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Selgitus:

Valideerimisraamatukogude kasutamine

Keerukamate valideerimisstsenaariumide jaoks kaaluge valideerimisraamatukogude kasutamist nagu:

Siin on näide Zodi kasutamisest:

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

export const CreateItemSchema = z.object({
  name: z.string().min(3, 'Elemendi nimi peab olema vähemalt 3 tähemärki pikk.'),
});
// 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 };
  }

  // Simuleeri andmebaasi interaktsiooni
  console.log('Loon elementi:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simuleeri latentsust

  console.log('Element edukalt loodud!');
}

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 || 'Tekkis viga.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Selgitus:

Turvakaalutlused

Server Actions parandab turvalisust, käivitades koodi serveris, kuid siiski on oluline järgida turvalisuse parimaid tavasid, et kaitsta oma rakendust levinud ohtude eest.

Saididevahelise päringu võltsimise (CSRF) ennetamine

CSRF-rünnakud kasutavad ära usaldust, mis veebisaidil on kasutaja brauseri vastu. CSRF-rünnakute ennetamiseks rakendage CSRF-kaitsemehhanisme.

Next.js tegeleb CSRF-kaitsega automaatselt Server Actions'i kasutamisel. Raamistik genereerib ja valideerib iga vormi esitamise jaoks CSRF-tõendi, tagades, et päring pärineb teie rakendusest.

Kasutaja autentimise ja autoriseerimise käsitlemine

Veenduge, et ainult volitatud kasutajad saavad teatud toiminguid teha. Rakendage autentimis- ja autoriseerimismehhanisme, et kaitsta tundlikke andmeid ja funktsionaalsust.

Siin on näide NextAuth.js kasutamisest Server Action'i kaitsmiseks:

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

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

  // Simuleeri andmebaasi interaktsiooni
  console.log('Loon elementi:', name, 'kasutaja poolt:', session.user?.email);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simuleeri latentsust

  console.log('Element edukalt loodud!');
}

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 || 'Tekkis viga.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Selgitus:

Sisendandmete puhastamine

Puhastage sisendandmed, et vältida saididevahelise skriptimise (XSS) rünnakuid. XSS-rünnakud toimuvad siis, kui veebisaidile süstitakse pahatahtlikku koodi, mis võib potentsiaalselt kahjustada kasutaja andmeid või rakenduse funktsionaalsust.

Kasutage raamatukogusid nagu DOMPurify või sanitize-html, et puhastada kasutaja sisestatud andmeid enne nende töötlemist oma Server Actions'ites.

Täiustatud tehnikad

Nüüd, kui oleme põhitõed selgeks saanud, uurime mõningaid täiustatud tehnikaid Server Actions'i tõhusaks kasutamiseks.

Optimistlikud uuendused

Optimistlikud uuendused pakuvad paremat kasutajakogemust, uuendades kasutajaliidest kohe, justkui tegevus õnnestuks, isegi enne kui server seda kinnitab. Kui tegevus serveris ebaõnnestub, taastatakse kasutajaliides eelmisesse olekusse.

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

  // Simuleeri andmebaasi interaktsiooni
  console.log('Uuendan elementi:', id, 'nimega:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simuleeri latentsust

  // Simuleeri ebaõnnestumist (demonstratsiooni eesmärgil)
  const shouldFail = Math.random() < 0.5;
  if (shouldFail) {
    throw new Error('Elemendi uuendamine ebaõnnestus.');
  }

  console.log('Element edukalt uuendatud!');
  return { name }; // Tagasta uuendatud nimi
}

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

    // Uuenda kasutajaliidest optimistlikult
    const newName = formData.get('name') as string;
    setItemName(newName);

    try {
      const result = await updateItem(id, formData);
      // Kui õnnestub, on uuendus juba kajastatud kasutajaliideses setItemName kaudu

    } catch (error: any) {
      setErrorMessage(error.message || 'Tekkis viga.');
      // Taasta kasutajaliides vea korral
      setItemName(initialName);
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    

Praegune nimi: {itemName}

{errorMessage &&

{errorMessage}

}
); }

Selgitus:

Andmete taasvalideerimine

Pärast seda, kui Server Action on andmeid muutnud, peate võib-olla vahemällu salvestatud andmed uuesti valideerima, et tagada kasutajaliidese värskeimate muudatuste kajastamine. Next.js pakub andmete uuesti valideerimiseks mitmeid viise:

Siin on näide tee uuesti valideerimisest pärast uue elemendi loomist:

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

  // Simuleeri andmebaasi interaktsiooni
  console.log('Loon elementi:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simuleeri latentsust

  console.log('Element edukalt loodud!');

  revalidatePath('/items'); // Valideeri uuesti /items tee
}

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 || 'Tekkis viga.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Selgitus:

Server Actions'i parimad tavad

Server Actions'i eeliste maksimeerimiseks kaaluge järgmisi parimaid tavasid:

Levinumad lõksud ja kuidas neid vältida

Kuigi Server Actions pakub mitmeid eeliseid, on olemas mõned levinud lõksud, millele tähelepanu pöörata:

Kokkuvõte

Next.js 14 Server Actions pakub võimsat ja tõhusat viisi vormide esitamise ja andmemuutuste käsitlemiseks otse serveris. Järgides selles juhendis kirjeldatud parimaid tavasid, saate luua robustseid, turvalisi ja jõudluspõhiseid veebirakendusi. Kasutage Server Actions'it oma koodi lihtsustamiseks, turvalisuse suurendamiseks ja üldise kasutajakogemuse parandamiseks. Integreerides neid põhimõtteid, arvestage oma arendusvalikute globaalse mõjuga. Veenduge, et teie vormid ja andmetöötlusprotsessid on ligipääsetavad, turvalised ja kasutajasõbralikud erinevatele rahvusvahelistele sihtrühmadele. See pühendumus kaasavusele ei paranda mitte ainult teie rakenduse kasutatavust, vaid laiendab ka selle haaret ja tõhusust globaalses mastaabis.