Lietuvių

Išsamus Next.js 14 Serverio Veiksmų vadovas, apimantis geriausias formų tvarkymo praktikas, duomenų tikrinimą, saugumo aspektus ir pažangias technikas šiuolaikinių interneto programų kūrimui.

Next.js 14 Serverio Veiksmai: Geriausių Formų Tvarkymo Praktikų Įvaldymas

Next.js 14 pristato galingas funkcijas, skirtas kurti našias ir vartotojui patogias interneto programas. Tarp jų Serverio Veiksmai (Server Actions) išsiskiria kaip transformuojantis būdas tvarkyti formų pateikimus ir duomenų mutacijas tiesiogiai serveryje. Šis vadovas pateikia išsamią Next.js 14 Serverio Veiksmų apžvalgą, sutelkiant dėmesį į geriausias formų tvarkymo praktikas, duomenų tikrinimą, saugumą ir pažangias technikas. Išnagrinėsime praktinius pavyzdžius ir pateiksime veiksmingų įžvalgų, kurios padės jums kurti patikimas ir keičiamo dydžio interneto programas.

Kas yra Next.js Serverio Veiksmai?

Serverio Veiksmai yra asinchroninės funkcijos, kurios veikia serveryje ir gali būti iškviečiamos tiesiogiai iš React komponentų. Jos pašalina poreikį tradiciniams API maršrutams tvarkyti formų pateikimus ir duomenų mutacijas, todėl kodas tampa paprastesnis, saugumas didesnis, o našumas geresnis. Serverio Veiksmai yra React Serverio Komponentai (RSCs), o tai reiškia, kad jie vykdomi serveryje, todėl pradiniai puslapių įkėlimai yra greitesni ir SEO geresnis.

Pagrindiniai Serverio Veiksmų privalumai:

Next.js 14 Projekto Paruošimas

Prieš pradedant dirbti su Serverio Veiksmais, įsitikinkite, kad turite paruoštą Next.js 14 projektą. Jei pradedate nuo nulio, sukurkite naują projektą naudodami šią komandą:

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

Įsitikinkite, kad jūsų projektas naudoja app katalogo struktūrą, kad galėtumėte pilnai išnaudoti Serverio Komponentų ir Veiksmų privalumus.

Pagrindinis Formų Tvarkymas su Serverio Veiksmais

Pradėkime nuo paprasto pavyzdžio: forma, kuri pateikia duomenis, kad sukurtų naują elementą duomenų bazėje. Naudosime paprastą formą su įvesties lauku ir pateikimo mygtuku.

Pavyzdys: Naujo Elemento Kūrimas

Pirmiausia, apibrėžkite Serverio Veiksmo funkciją savo React komponente. Ši funkcija tvarkys formos pateikimo logiką serveryje.

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

import { useState } from 'react';

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

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

  // Duomenų bazės sąveikos imitavimas
  console.log('Creating item:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Vėlavimo imitavimas

  console.log('Item created successfully!'); // Elementas sėkmingai sukurtas!
}

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

  return (
    
); }

Paaiškinimas:

Duomenų Tikrinimas

Duomenų tikrinimas yra labai svarbus siekiant užtikrinti duomenų vientisumą ir išvengti saugumo pažeidžiamumų. Serverio Veiksmai suteikia puikią galimybę atlikti tikrinimą serverio pusėje. Šis požiūris padeda sumažinti rizikas, susijusias tik su kliento pusės tikrinimu.

Pavyzdys: Įvesties Duomenų Tikrinimas

Pakeiskite createItem Serverio Veiksmą, kad įtrauktumėte tikrinimo logiką.

// 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('Elemento pavadinimas turi būti bent 3 simbolių ilgio.');
  }

  // Duomenų bazės sąveikos imitavimas
  console.log('Creating item:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Vėlavimo imitavimas

  console.log('Item created successfully!'); // Elementas sėkmingai sukurtas!
}

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 || 'Įvyko klaida.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Paaiškinimas:

Tikrinimo Bibliotekų Naudojimas

Sudėtingesniems tikrinimo scenarijams apsvarstykite galimybę naudoti tokias tikrinimo bibliotekas kaip:

Štai pavyzdys naudojant Zod:

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

export const CreateItemSchema = z.object({
  name: z.string().min(3, 'Elemento pavadinimas turi būti bent 3 simbolių ilgio.'),
});
// 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 };
  }

  // Duomenų bazės sąveikos imitavimas
  console.log('Creating item:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Vėlavimo imitavimas

  console.log('Item created successfully!'); // Elementas sėkmingai sukurtas!
}

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 || 'Įvyko klaida.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Paaiškinimas:

Saugumo Aspektai

Serverio Veiksmai padidina saugumą vykdydami kodą serveryje, tačiau vis tiek labai svarbu laikytis geriausių saugumo praktikų, kad apsaugotumėte savo programą nuo įprastų grėsmių.

Apsauga nuo Tarpvietinių Užklausų Klastojimo (CSRF)

CSRF atakos išnaudoja pasitikėjimą, kurį svetainė turi vartotojo naršyklėje. Norėdami išvengti CSRF atakų, įdiekite CSRF apsaugos mechanizmus.

Next.js automatiškai tvarko CSRF apsaugą, kai naudojami Serverio Veiksmai. Sistema generuoja ir patvirtina CSRF žetoną kiekvienam formos pateikimui, užtikrindama, kad užklausa kiltų iš jūsų programos.

Vartotojo Autentifikavimo ir Autorizavimo Tvarkymas

Užtikrinkite, kad tik autorizuoti vartotojai galėtų atlikti tam tikrus veiksmus. Įdiekite autentifikavimo ir autorizavimo mechanizmus, kad apsaugotumėte jautrius duomenis ir funkcionalumą.

Štai pavyzdys, kaip apsaugoti Serverio Veiksmą naudojant NextAuth.js:

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

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

  // Duomenų bazės sąveikos imitavimas
  console.log('Creating item:', name, 'by user:', session.user?.email);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Vėlavimo imitavimas

  console.log('Item created successfully!'); // Elementas sėkmingai sukurtas!
}

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 || 'Įvyko klaida.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Paaiškinimas:

Įvesties Duomenų Valymas (Sanitizing)

Išvalykite įvesties duomenis, kad išvengtumėte Tarpvietinio Scenarijų Vykdymo (XSS) atakų. XSS atakos įvyksta, kai į svetainę įterpiamas kenkėjiškas kodas, galintis pakenkti vartotojo duomenims ar programos funkcionalumui.

Naudokite bibliotekas, tokias kaip DOMPurify ar sanitize-html, kad išvalytumėte vartotojo pateiktus duomenis prieš juos apdorojant Serverio Veiksmuose.

Pažangios Technikos

Dabar, kai aptarėme pagrindus, išnagrinėkime keletą pažangių technikų, kaip efektyviai naudoti Serverio Veiksmus.

Optimistiniai Atnaujinimai

Optimistiniai atnaujinimai suteikia geresnę vartotojo patirtį, nedelsiant atnaujinant vartotojo sąsają taip, lyg veiksmas būtų sėkmingas, dar prieš serveriui tai patvirtinant. Jei veiksmas serveryje nepavyksta, vartotojo sąsaja grąžinama į ankstesnę būseną.

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

  // Duomenų bazės sąveikos imitavimas
  console.log('Updating item:', id, 'with name:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Vėlavimo imitavimas

  // Nesėkmės imitavimas (demonstraciniais tikslais)
  const shouldFail = Math.random() < 0.5;
  if (shouldFail) {
    throw new Error('Nepavyko atnaujinti elemento.');
  }

  console.log('Item updated successfully!'); // Elementas sėkmingai atnaujintas!
  return { name }; // Grąžiname atnaujintą pavadinimą
}

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

    // Optimistiškai atnaujiname vartotojo sąsają
    const newName = formData.get('name') as string;
    setItemName(newName);

    try {
      const result = await updateItem(id, formData);
      // Sėkmės atveju atnaujinimas jau atsispindi sąsajoje per setItemName

    } catch (error: any) {
      setErrorMessage(error.message || 'Įvyko klaida.');
      // Klaidos atveju grąžiname sąsają į pradinę būseną
      setItemName(initialName);
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    

Dabartinis pavadinimas: {itemName}

{errorMessage &&

{errorMessage}

}
); }

Paaiškinimas:

Duomenų Atnaujinimas (Revalidating)

Po to, kai Serverio Veiksmas pakeičia duomenis, gali prireikti atnaujinti talpykloje esančius duomenis, kad vartotojo sąsaja atspindėtų naujausius pakeitimus. Next.js siūlo kelis būdus, kaip atnaujinti duomenis:

Štai pavyzdys, kaip atnaujinti kelią po naujo elemento sukūrimo:

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

  // Duomenų bazės sąveikos imitavimas
  console.log('Creating item:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Vėlavimo imitavimas

  console.log('Item created successfully!'); // Elementas sėkmingai sukurtas!

  revalidatePath('/items'); // Atnaujiname /items kelią
}

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 || 'Įvyko klaida.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Paaiškinimas:

Geriausios Serverio Veiksmų Praktikos

Norėdami maksimaliai išnaudoti Serverio Veiksmų teikiamus privalumus, apsvarstykite šias geriausias praktikas:

Dažniausios Klaidos ir Kaip Jų Išvengti

Nors Serverio Veiksmai siūlo daug privalumų, yra keletas dažniausiai pasitaikančių klaidų, kurių reikėtų žinoti:

Išvada

Next.js 14 Serverio Veiksmai suteikia galingą ir efektyvų būdą tvarkyti formų pateikimus ir duomenų mutacijas tiesiogiai serveryje. Laikydamiesi šiame vadove pateiktų geriausių praktikų, galite kurti patikimas, saugias ir našias interneto programas. Pasinaudokite Serverio Veiksmais, kad supaprastintumėte savo kodą, padidintumėte saugumą ir pagerintumėte bendrą vartotojo patirtį. Integruodami šiuos principus, apsvarstykite savo kūrimo sprendimų pasaulinį poveikį. Užtikrinkite, kad jūsų formos ir duomenų tvarkymo procesai būtų prieinami, saugūs ir patogūs įvairioms tarptautinėms auditorijoms. Šis įsipareigojimas įtraukumui ne tik pagerins jūsų programos naudojimą, bet ir praplės jos pasiekiamumą bei efektyvumą pasauliniu mastu.

Next.js 14 Serverio Veiksmai: Geriausių Formų Tvarkymo Praktikų Įvaldymas | MLOG