O'zbek

Next.js 14 Server Actions bo'yicha to'liq qo'llanma. Shakllarni boshqarish, ma'lumotlarni tekshirish, xavfsizlik va zamonaviy veb-ilovalar yaratish uchun ilg'or usullar.

Next.js 14 Server Actions: Shakllarni Boshqarishning Eng Yaxshi Amaliyotlarini O'zlashtirish

Next.js 14 yuqori unumdorlikka ega va foydalanuvchiga qulay veb-ilovalar yaratish uchun kuchli funksiyalarni taqdim etadi. Ular orasida Server Actions shakllarni yuborish va ma'lumotlar mutatsiyalarini to'g'ridan-to'g'ri serverda boshqarishning o'zgartiruvchi usuli sifatida ajralib turadi. Ushbu qo'llanma Next.js 14'dagi Server Actions'ni to'liq qamrab oladi, bunda shakllarni boshqarish, ma'lumotlarni tekshirish, xavfsizlik va ilg'or usullarning eng yaxshi amaliyotlariga e'tibor qaratiladi. Biz mustahkam va kengaytiriladigan veb-ilovalar yaratishingizga yordam berish uchun amaliy misollarni ko'rib chiqamiz va amaliy tushunchalar beramiz.

Next.js Server Actions nima?

Server Actions — bu serverda ishlaydigan va React komponentlaridan to'g'ridan-to'g'ri chaqirilishi mumkin bo'lgan asinxron funksiyalardir. Ular shakllarni yuborish va ma'lumotlar mutatsiyalarini boshqarish uchun an'anaviy API yo'nalishlariga bo'lgan ehtiyojni yo'qotadi, bu esa kodni soddalashtirish, xavfsizlikni yaxshilash va unumdorlikni oshirishga olib keladi. Server Actions React Server Components (RSC) hisoblanadi, ya'ni ular serverda bajariladi, bu esa sahifaning dastlabki yuklanishini tezlashtiradi va SEO'ni yaxshilaydi.

Server Actions'ning asosiy afzalliklari:

Next.js 14 Loyihangizni Sozlash

Server Actions'ni o'rganishdan oldin, Next.js 14 loyihangiz sozlanganligiga ishonch hosil qiling. Agar noldan boshlayotgan bo'lsangiz, quyidagi buyruq yordamida yangi loyiha yarating:

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

Loyihangiz Server Komponentlari va Actions'dan to'liq foydalanish uchun app katalog tuzilmasidan foydalanayotganiga ishonch hosil qiling.

Server Actions Yordamida Asosiy Shakllarni Boshqarish

Keling, oddiy misoldan boshlaymiz: ma'lumotlar bazasida yangi element yaratish uchun ma'lumot yuboradigan shakl. Biz oddiy shakldan, kiritish maydoni va yuborish tugmasidan foydalanamiz.

Misol: Yangi Element Yaratish

Birinchi navbatda, React komponentingiz ichida Server Action funksiyasini aniqlang. Ushbu funksiya serverda shaklni yuborish mantig'ini boshqaradi.

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

import { useState } from 'react';

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

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

  // Ma'lumotlar bazasi bilan o'zaro ta'sirni simulyatsiya qilish
  console.log('Element yaratilmoqda:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Kechikishni simulyatsiya qilish

  console.log('Element muvaffaqiyatli yaratildi!');
}

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

  return (
    
); }

Tushuntirish:

Ma'lumotlarni Tekshirish

Ma'lumotlarni tekshirish ma'lumotlar yaxlitligini ta'minlash va xavfsizlik zaifliklarini oldini olish uchun juda muhimdir. Server Actions server tomonida tekshirishni amalga oshirish uchun ajoyib imkoniyat yaratadi. Ushbu yondashuv faqat mijoz tomonidagi tekshirish bilan bog'liq xavflarni kamaytirishga yordam beradi.

Misol: Kiritilgan Ma'lumotlarni Tekshirish

createItem Server Action'ini tekshirish mantig'ini qo'shish uchun o'zgartiring.

// 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("Element nomi kamida 3 belgidan iborat bo'lishi kerak.");
  }

  // Ma'lumotlar bazasi bilan o'zaro ta'sirni simulyatsiya qilish
  console.log('Element yaratilmoqda:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Kechikishni simulyatsiya qilish

  console.log('Element muvaffaqiyatli yaratildi!');
}

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 || 'Xatolik yuz berdi.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Tushuntirish:

Tekshirish Kutubxonalaridan Foydalanish

Murakkabroq tekshirish holatlari uchun quyidagi kabi tekshirish kutubxonalaridan foydalanishni o'ylab ko'ring:

Mana Zod yordamida misol:

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

export const CreateItemSchema = z.object({
  name: z.string().min(3, "Element nomi kamida 3 belgidan iborat bo'lishi kerak."),
});
// 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 };
  }

  // Ma'lumotlar bazasi bilan o'zaro ta'sirni simulyatsiya qilish
  console.log('Element yaratilmoqda:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Kechikishni simulyatsiya qilish

  console.log('Element muvaffaqiyatli yaratildi!');
}

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 || 'Xatolik yuz berdi.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Tushuntirish:

Xavfsizlik Masalalari

Server Actions serverda kodni bajarish orqali xavfsizlikni oshiradi, ammo ilovangizni umumiy tahdidlardan himoya qilish uchun xavfsizlikning eng yaxshi amaliyotlariga rioya qilish hali ham muhimdir.

Saytlararo So'rovlarni Soxtalashtirishdan (CSRF) Himoyalanish

CSRF hujumlari veb-saytning foydalanuvchi brauzeriga bo'lgan ishonchidan foydalanadi. CSRF hujumlarining oldini olish uchun CSRF himoya mexanizmlarini joriy qiling.

Next.js Server Actions'dan foydalanganda CSRF himoyasini avtomatik ravishda boshqaradi. Freymvork har bir shaklni yuborish uchun CSRF tokenini yaratadi va tekshiradi, bu esa so'rov sizning ilovangizdan kelib chiqqanligini ta'minlaydi.

Foydalanuvchi Autentifikatsiyasi va Avtorizatsiyasini Boshqarish

Faqat ruxsat berilgan foydalanuvchilar ma'lum harakatlarni bajarishi mumkinligiga ishonch hosil qiling. Maxfiy ma'lumotlar va funksionallikni himoya qilish uchun autentifikatsiya va avtorizatsiya mexanizmlarini joriy qiling.

Mana, Server Action'ni himoya qilish uchun NextAuth.js'dan foydalanishga misol:

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

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

  // Ma'lumotlar bazasi bilan o'zaro ta'sirni simulyatsiya qilish
  console.log('Element yaratilmoqda:', name, 'foydalanuvchi tomonidan:', session.user?.email);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Kechikishni simulyatsiya qilish

  console.log('Element muvaffaqiyatli yaratildi!');
}

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 || 'Xatolik yuz berdi.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Tushuntirish:

Kiritilgan Ma'lumotlarni Tozalash

Saytlararo Skripting (XSS) hujumlarining oldini olish uchun kiritilgan ma'lumotlarni tozalang. XSS hujumlari zararli kod veb-saytga kiritilganda sodir bo'ladi, bu esa foydalanuvchi ma'lumotlari yoki ilova funksionalligiga xavf solishi mumkin.

Server Actions'da foydalanuvchi tomonidan taqdim etilgan ma'lumotlarni qayta ishlashdan oldin ularni tozalash uchun DOMPurify yoki sanitize-html kabi kutubxonalardan foydalaning.

Ilg'or Texnikalar

Asoslarni o'rganib chiqqanimizdan so'ng, keling, Server Actions'dan samarali foydalanish uchun ba'zi ilg'or texnikalarni ko'rib chiqamiz.

Optimistik Yangilanishlar

Optimistik yangilanishlar, server tasdiqlashidan oldin ham, harakat muvaffaqiyatli bo'lishini taxmin qilib, UI'ni darhol yangilash orqali yaxshiroq foydalanuvchi tajribasini ta'minlaydi. Agar serverda harakat muvaffaqiyatsiz bo'lsa, UI avvalgi holatiga qaytariladi.

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

  // Ma'lumotlar bazasi bilan o'zaro ta'sirni simulyatsiya qilish
  console.log('Element yangilanmoqda:', id, 'yangi nomi:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Kechikishni simulyatsiya qilish

  // Muvaffaqiyatsizlikni simulyatsiya qilish (namoyish uchun)
  const shouldFail = Math.random() < 0.5;
  if (shouldFail) {
    throw new Error("Elementni yangilab bo'lmadi.");
  }

  console.log('Element muvaffaqiyatli yangilandi!');
  return { name }; // Yangilangan nomni qaytarish
}

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

    // UI'ni optimistik tarzda yangilash
    const newName = formData.get('name') as string;
    setItemName(newName);

    try {
      const result = await updateItem(id, formData);
      // Muvaffaqiyatli bo'lsa, yangilanish allaqachon setItemName orqali UI'da aks etgan

    } catch (error: any) {
      setErrorMessage(error.message || 'Xatolik yuz berdi.');
      // Xatolik yuz berganda UI'ni orqaga qaytarish
      setItemName(initialName);
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    

Joriy nom: {itemName}

{errorMessage &&

{errorMessage}

}
); }

Tushuntirish:

Ma'lumotlarni Qayta Tekshirish (Revalidatsiya)

Server Action ma'lumotlarni o'zgartirgandan so'ng, UI so'nggi o'zgarishlarni aks ettirishi uchun keshdagi ma'lumotlarni qayta tekshirishingiz kerak bo'lishi mumkin. Next.js ma'lumotlarni qayta tekshirishning bir necha usulini taqdim etadi:

Mana yangi element yaratilgandan so'ng yo'lni qayta tekshirishga misol:

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

  // Ma'lumotlar bazasi bilan o'zaro ta'sirni simulyatsiya qilish
  console.log('Element yaratilmoqda:', name);

  await new Promise((resolve) => setTimeout(resolve, 1000)); // Kechikishni simulyatsiya qilish

  console.log('Element muvaffaqiyatli yaratildi!');

  revalidatePath('/items'); // /items yo'lini qayta tekshirish (revalidate)
}

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 || 'Xatolik yuz berdi.');
    } finally {
      setIsSubmitting(false);
    }
  }

  return (
    
{errorMessage &&

{errorMessage}

}
); }

Tushuntirish:

Server Actions Uchun Eng Yaxshi Amaliyotlar

Server Actions'ning afzalliklaridan maksimal darajada foydalanish uchun quyidagi eng yaxshi amaliyotlarni ko'rib chiqing:

Umumiy Xatolar va Ulardan Qochish Yo'llari

Server Actions ko'plab afzalliklarni taklif qilsa-da, e'tiborga olish kerak bo'lgan ba'zi umumiy xatolar mavjud:

Xulosa

Next.js 14 Server Actions shakllarni yuborish va ma'lumotlar mutatsiyalarini to'g'ridan-to'g'ri serverda boshqarishning kuchli va samarali usulini taqdim etadi. Ushbu qo'llanmada keltirilgan eng yaxshi amaliyotlarga rioya qilish orqali siz mustahkam, xavfsiz va yuqori unumdorlikka ega veb-ilovalar yaratishingiz mumkin. Kodingizni soddalashtirish, xavfsizlikni oshirish va umumiy foydalanuvchi tajribasini yaxshilash uchun Server Actions'ni qabul qiling. Ushbu tamoyillarni integratsiya qilayotganda, ishlab chiqish tanlovlaringizning global ta'sirini hisobga oling. Shakllaringiz va ma'lumotlarni qayta ishlash jarayonlaringiz turli xalqaro auditoriyalar uchun qulay, xavfsiz va foydalanuvchiga do'stona ekanligiga ishonch hosil qiling. Inkluzivlikka bo'lgan bu sodiqlik nafaqat ilovangizning foydalanish qulayligini yaxshilaydi, balki uning global miqyosdagi qamrovi va samaradorligini ham kengaytiradi.