Slovenščina

Celovit vodnik po strežniških akcijah v Next.js 14, ki zajema najboljše prakse za upravljanje obrazcev, validacijo podatkov, varnostne vidike in napredne tehnike za izdelavo sodobnih spletnih aplikacij.

Strežniške akcije v Next.js 14: Obvladovanje najboljših praks za upravljanje obrazcev

Next.js 14 prinaša zmogljive funkcije za izdelavo zmogljivih in uporabniku prijaznih spletnih aplikacij. Med njimi izstopajo strežniške akcije (Server Actions) kot preoblikovalni način za obravnavo oddaj obrazcev in mutacij podatkov neposredno na strežniku. Ta vodnik ponuja celovit pregled strežniških akcij v Next.js 14, osredotočen na najboljše prakse za upravljanje obrazcev, validacijo podatkov, varnost in napredne tehnike. Raziskali bomo praktične primere in ponudili uporabne vpoglede za pomoč pri gradnji robustnih in razširljivih spletnih aplikacij.

Kaj so strežniške akcije v Next.js?

Strežniške akcije so asinhrone funkcije, ki se izvajajo na strežniku in jih je mogoče klicati neposredno iz komponent React. Odpravljajo potrebo po tradicionalnih API poteh za obravnavo oddaj obrazcev in mutacij podatkov, kar vodi v poenostavljeno kodo, izboljšano varnost in večjo zmogljivost. Strežniške akcije so React strežniške komponente (RSCs), kar pomeni, da se izvajajo na strežniku, kar vodi do hitrejšega začetnega nalaganja strani in izboljšanega SEO.

Ključne prednosti strežniških akcij:

Nastavitev vašega projekta Next.js 14

Preden se poglobite v strežniške akcije, se prepričajte, da imate nastavljen projekt Next.js 14. Če začenjate iz nič, ustvarite nov projekt z naslednjim ukazom:

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

Prepričajte se, da vaš projekt uporablja strukturo mape app, da v celoti izkoristite strežniške komponente in akcije.

Osnovno upravljanje obrazcev s strežniškimi akcijami

Začnimo s preprostim primerom: obrazcem, ki pošilja podatke za ustvarjanje novega predmeta v bazi podatkov. Uporabili bomo preprost obrazec z vnosnim poljem in gumbom za oddajo.

Primer: Ustvarjanje novega predmeta

Najprej definirajte funkcijo strežniške akcije znotraj vaše komponente React. Ta funkcija bo obravnavala logiko oddaje obrazca na strežniku.

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

import { useState } from 'react';

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

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

  // Simulacija interakcije z bazo podatkov
  console.log('Ustvarjanje predmeta:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulacija zakasnitve

  console.log('Predmet uspešno ustvarjen!');
}

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

  return (
    
); }

Pojasnilo:

Validacija podatkov

Validacija podatkov je ključnega pomena za zagotavljanje integritete podatkov in preprečevanje varnostnih ranljivosti. Strežniške akcije ponujajo odlično priložnost za izvajanje validacije na strani strežnika. Ta pristop pomaga zmanjšati tveganja, povezana zgolj z validacijo na strani odjemalca.

Primer: Validacija vnosnih podatkov

Spremenite strežniško akcijo createItem, da vključuje logiko validacije.

// 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('Ime predmeta mora biti dolgo vsaj 3 znake.');
  }

  // Simulacija interakcije z bazo podatkov
  console.log('Ustvarjanje predmeta:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulacija zakasnitve

  console.log('Predmet uspešno ustvarjen!');
}

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 || 'Prišlo je do napake.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Pojasnilo:

Uporaba knjižnic za validacijo

Za bolj zapletene scenarije validacije razmislite o uporabi knjižnic za validacijo, kot sta:

Tukaj je primer z uporabo knjižnice Zod:

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

export const CreateItemSchema = z.object({
  name: z.string().min(3, 'Ime predmeta mora biti dolgo vsaj 3 znake.'),
});
// 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 };
  }

  // Simulacija interakcije z bazo podatkov
  console.log('Ustvarjanje predmeta:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulacija zakasnitve

  console.log('Predmet uspešno ustvarjen!');
}

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 || 'Prišlo je do napake.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Pojasnilo:

Varnostni vidiki

Strežniške akcije povečujejo varnost z izvajanjem kode na strežniku, vendar je še vedno ključnega pomena upoštevati najboljše varnostne prakse za zaščito vaše aplikacije pred pogostimi grožnjami.

Preprečevanje ponarejanja zahtev med spletnimi mesti (CSRF)

Napadi CSRF izkoriščajo zaupanje, ki ga spletno mesto ima v brskalnik uporabnika. Za preprečevanje napadov CSRF implementirajte mehanizme za zaščito pred CSRF.

Next.js samodejno obravnava zaščito pred CSRF pri uporabi strežniških akcij. Ogrodje generira in preverja žeton CSRF za vsako oddajo obrazca, s čimer zagotavlja, da zahteva izvira iz vaše aplikacije.

Obravnavanje avtentikacije in avtorizacije uporabnikov

Zagotovite, da lahko samo pooblaščeni uporabniki izvajajo določene akcije. Implementirajte mehanizme za avtentikacijo in avtorizacijo za zaščito občutljivih podatkov in funkcionalnosti.

Tukaj je primer uporabe NextAuth.js za zaščito strežniške akcije:

// 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('Nepooblaščeno');
  }

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

  // Simulacija interakcije z bazo podatkov
  console.log('Ustvarjanje predmeta:', name, 's strani uporabnika:', session.user?.email);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulacija zakasnitve

  console.log('Predmet uspešno ustvarjen!');
}

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 || 'Prišlo je do napake.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Pojasnilo:

Sanitizacija vnosnih podatkov

Sanitizirajte vnosne podatke, da preprečite napade skriptiranja med spletnimi mesti (XSS). Napadi XSS se zgodijo, ko je zlonamerna koda vbrizgana v spletno mesto, kar lahko ogrozi uporabniške podatke ali funkcionalnost aplikacije.

Uporabite knjižnice, kot sta DOMPurify ali sanitize-html, za sanitizacijo vnosov, ki jih posredujejo uporabniki, preden jih obdelate v svojih strežniških akcijah.

Napredne tehnike

Zdaj, ko smo pokrili osnove, raziščimo nekaj naprednih tehnik za učinkovito uporabo strežniških akcij.

Optimistične posodobitve

Optimistične posodobitve zagotavljajo boljšo uporabniško izkušnjo s takojšnjim posodabljanjem uporabniškega vmesnika, kot da bo akcija uspešna, še preden jo strežnik potrdi. Če akcija na strežniku ne uspe, se uporabniški vmesnik povrne v prejšnje stanje.

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

  // Simulacija interakcije z bazo podatkov
  console.log('Posodabljanje predmeta:', id, 'z imenom:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulacija zakasnitve

  // Simulacija napake (za demonstracijske namene)
  const shouldFail = Math.random() < 0.5;
  if (shouldFail) {
    throw new Error('Posodobitev predmeta ni uspela.');
  }

  console.log('Predmet uspešno posodobljen!');
  return { name }; // Vrnite posodobljeno ime
}

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čno posodobite uporabniški vmesnik
    const newName = formData.get('name') as string;
    setItemName(newName);

    try {
      const result = await updateItem(id, formData);
      // Če je uspešno, se posodobitev že odraža v UI preko setItemName

    } catch (error: any) {
      setErrorMessage(error.message || 'Prišlo je do napake.');
      // Povrnite UI v prvotno stanje ob napaki
      setItemName(initialName);
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    

Trenutno ime: {itemName}

{errorMessage &&

{errorMessage}

}
); }

Pojasnilo:

Ponovno preverjanje podatkov

Ko strežniška akcija spremeni podatke, boste morda morali ponovno preveriti predpomnjene podatke, da zagotovite, da uporabniški vmesnik odraža najnovejše spremembe. Next.js ponuja več načinov za ponovno preverjanje podatkov:

Tukaj je primer ponovnega preverjanja poti po ustvarjanju novega predmeta:

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

  // Simulacija interakcije z bazo podatkov
  console.log('Ustvarjanje predmeta:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Simulacija zakasnitve

  console.log('Predmet uspešno ustvarjen!');

  revalidatePath('/items'); // Ponovno preveri pot /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 || 'Prišlo je do napake.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Pojasnilo:

Najboljše prakse za strežniške akcije

Da bi čim bolj izkoristili prednosti strežniških akcij, upoštevajte naslednje najboljše prakse:

Pogoste napake in kako se jim izogniti

Čeprav strežniške akcije ponujajo številne prednosti, obstajajo nekatere pogoste napake, na katere je treba biti pozoren:

Zaključek

Strežniške akcije v Next.js 14 ponujajo zmogljiv in učinkovit način za obravnavo oddaj obrazcev in mutacij podatkov neposredno na strežniku. Z upoštevanjem najboljših praks, opisanih v tem vodniku, lahko gradite robustne, varne in zmogljive spletne aplikacije. Sprejmite strežniške akcije, da poenostavite svojo kodo, povečate varnost in izboljšate celotno uporabniško izkušnjo. Med vključevanjem teh načel upoštevajte globalni vpliv svojih razvojnih odločitev. Zagotovite, da so vaši obrazci in postopki za obravnavo podatkov dostopni, varni in uporabniku prijazni za raznoliko mednarodno občinstvo. Ta zavezanost vključevanju ne bo le izboljšala uporabnosti vaše aplikacije, ampak bo tudi razširila njen doseg in učinkovitost v svetovnem merilu.