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:
- Lihtsustatud kood: VÀhendage korduvat koodi, kaotades vajaduse eraldi API-marsruutide jÀrele.
- Parem turvalisus: Serveripoolne tÀitmine minimeerib kliendipoolseid turvanÔrkusi.
- Suurem jÔudlus: KÀivitage andmemuutused otse serveris kiiremate vastuseaegade saavutamiseks.
- Optimeeritud SEO: Kasutage serveripoolset renderdamist paremaks otsingumootorite indekseerimiseks.
- TĂŒĂŒbiohutus: Saage kasu tĂ€ielikust tĂŒĂŒbiohutusest TypeScriptiga.
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:
- Direktiiv
'use client'nÀitab, et tegemist on kliendikomponendiga. - Funktsioon
createItemon mÀrgistatud direktiiviga'use server', mis nÀitab, et see on Server Action. - Funktsioon
handleSubmiton kliendipoolne funktsioon, mis kutsub vÀlja serveri tegevuse. See haldab ka kasutajaliidese olekut, nÀiteks nupu keelamist esitamise ajal. - Elemendi
<form>atribuutactionon seatud funktsioonilehandleSubmit. - Meetod
formData.get('name')hangib sisestusvÀlja 'name' vÀÀrtuse. await new Promisesimuleerib andmebaasi operatsiooni ja lisab latentsust.
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:
- Funktsioon
createItemkontrollib nĂŒĂŒd, kasnameon kehtiv (vĂ€hemalt 3 tĂ€hemĂ€rki pikk). - Kui valideerimine ebaĂ”nnestub, visatakse viga.
- Funktsioon
handleSubmiton uuendatud, et pĂŒĂŒda kinni kĂ”ik Server Action'i poolt visatud vead ja kuvada kasutajale veateade.
Valideerimisraamatukogude kasutamine
Keerukamate valideerimisstsenaariumide jaoks kaaluge valideerimisraamatukogude kasutamist nagu:
- Zod: TypeScript-pÔhine skeemi deklareerimise ja valideerimise raamatukogu.
- Yup: JavaScripti skeemiehitaja vÀÀrtuste parsimiseks, valideerimiseks ja teisendamiseks.
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:
CreateItemSchemadefineerib valideerimisreeglid vÀljalename, kasutades Zodi.- Meetod
safeParseĂŒritab sisendandmeid valideerida. Kui valideerimine ebaĂ”nnestub, tagastab see objekti vigadega. - Objekt
errorssisaldab ĂŒksikasjalikku teavet valideerimise ebaĂ”nnestumiste kohta.
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:
- Funktsioon
getServerSessionhangib kasutaja seansi teabe. - Kui kasutaja pole autenditud (seanss puudub), visatakse viga, mis takistab Server Action'i kÀivitamist.
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:
- Enne Server Action'i kutsumist uuendatakse kasutajaliides kohe uue elemendi nimega, kasutades
setItemName. - Kui Server Action ebaÔnnestub, taastatakse kasutajaliides algse elemendi nimega.
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:
- Revalidate Path: Valideerige uuesti vahemÀlu konkreetse tee jaoks.
- Revalidate Tag: Valideerige uuesti vahemÀlu konkreetse sildiga seotud andmete jaoks.
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:
- Funktsioon
revalidatePath('/items')tĂŒhistab vahemĂ€lu tee/itemsjaoks, tagades, et jĂ€rgmine pĂ€ring sellele teele hangib uusimad andmed.
Server Actions'i parimad tavad
Server Actions'i eeliste maksimeerimiseks kaaluge jÀrgmisi parimaid tavasid:
- Hoidke Server Actions vĂ€ikesed ja keskendunud: Server Actions peaksid tĂ€itma ĂŒhte, hĂ€sti defineeritud ĂŒlesannet. VĂ€ltige keerulist loogikat Server Actions'ites, et sĂ€ilitada loetavus ja testitavus.
- Kasutage kirjeldavaid nimesid: Andke oma Server Actions'itele kirjeldavad nimed, mis nÀitavad selgelt nende eesmÀrki.
- KÀsitlege vigu sujuvalt: Rakendage robustne veakÀsitlus, et anda kasutajale informatiivset tagasisidet ja vÀltida rakenduse kokkujooksmist.
- Valideerige andmeid pÔhjalikult: Teostage pÔhjalik andmete valideerimine, et tagada andmete terviklikkus ja ennetada turvanÔrkusi.
- Turvake oma Server Actions: Rakendage autentimis- ja autoriseerimismehhanisme, et kaitsta tundlikke andmeid ja funktsionaalsust.
- Optimeerige jÔudlust: JÀlgige oma Server Actions'i jÔudlust ja optimeerige neid vastavalt vajadusele, et tagada kiired vastuseajad.
- Kasutage vahemÀlu tÔhusalt: Kasutage Next.js'i vahemÀlumehhanisme jÔudluse parandamiseks ja andmebaasi koormuse vÀhendamiseks.
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:
- Liiga keerulised Server Actions: VĂ€ltige liiga palju loogikat ĂŒhes Server Action'is. Jaotage keerulised ĂŒlesanded vĂ€iksemateks, paremini hallatavateks funktsioonideks.
- VeakĂ€sitluse eiramine: Lisage alati veakĂ€sitlus, et pĂŒĂŒda kinni ootamatuid vigu ja anda kasutajale kasulikku tagasisidet.
- Turvalisuse parimate tavade eiramine: JĂ€rgige turvalisuse parimaid tavasid, et kaitsta oma rakendust levinud ohtude, nagu XSS ja CSRF, eest.
- Andmete taasvalideerimise unustamine: Veenduge, et valideerite vahemÀllu salvestatud andmed uuesti pÀrast seda, kui Server Action on andmeid muutnud, et hoida kasutajaliides ajakohasena.
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.