O'zbek

Next.js Route Handlers yordamida kuchli API endpointlarini yaratishni o'rganing. Ushbu qo'llanma asosiy sozlashdan tortib ilg'or texnikalargacha, amaliy misollar va eng yaxshi amaliyotlarni o'z ichiga oladi.

Next.js Route Handlers: API Endpontlarini Yaratish Bo'yicha To'liq Qo'llanma

Next.js server tomonida renderlash, statik sayt yaratish va endi Route Handlers kabi kuchli xususiyatlari bilan veb-ilovalarni yaratish usulimizni inqilob qildi. Route Handlers to'g'ridan-to'g'ri Next.js ilovangiz ichida API endpointlarini yaratishning moslashuvchan va samarali usulini taqdim etadi. Ushbu qo'llanma Route Handlers konsepsiyasini, ularning afzalliklarini va mustahkam API'lar yaratish uchun ulardan qanday samarali foydalanishni o'rganadi.

Next.js Route Handlers nima?

Route Handlers - bu Next.js loyihasining app katalogi ichida aniqlangan, kiruvchi HTTP so'rovlarini qayta ishlaydigan funksiyalardir. Eski pages/api yondashuvidan (API Routes ishlatadigan) farqli o'laroq, Route Handlers React komponentlaringiz yonida API endpointlarini aniqlashning yanada soddalashtirilgan va moslashuvchan usulini taklif etadi. Ular mohiyatan edge'da yoki siz tanlagan server muhitida bajariladigan serverless funksiyalardir.

Route Handlers'ni so'rovlarni qayta ishlash, ma'lumotlar bazalari bilan o'zaro ishlash va javoblarni qaytarish uchun mas'ul bo'lgan Next.js ilovangizning backend mantiq'i deb o'ylang.

Route Handlers'dan foydalanishning afzalliklari

Next.js loyihangizni sozlash

Route Handlers'ga sho'ng'ishdan oldin, app katalogi bilan sozlangan Next.js loyihangiz borligiga ishonch hosil qiling. Agar yangi loyiha boshlayotgan bo'lsangiz, quyidagi buyruqdan foydalaning:

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

Yangi marshrutlash tizimini yoqish uchun sozlash jarayonida app katalogini tanlang.

Birinchi Route Handler'ingizni yaratish

Keling, JSON javobini qaytaradigan oddiy API endpointini yaratamiz. app katalogi ichida yangi katalog yarating, masalan, /app/api/hello. Ushbu katalog ichida route.ts (yoki TypeScript ishlatmayotgan bo'lsangiz route.js) nomli fayl yarating.

Birinchi Route Handler'ingiz uchun kod:

// app/api/hello/route.ts
import { NextResponse } from 'next/server';

export async function GET(request: Request) {
 return NextResponse.json({ message: 'Hello from Next.js Route Handlers!' });
}

Tushuntirish:

Endi siz ushbu endpointga brauzeringizda /api/hello manziliga o'tish yoki curl yoki Postman kabi vositalardan foydalanish orqali kirishingiz mumkin.

Turli xil HTTP usullarini qayta ishlash

Route Handlers GET, POST, PUT, DELETE, PATCH va OPTIONS kabi turli xil HTTP usullarini qo'llab-quvvatlaydi. Siz bir xil route.ts fayli ichida har bir usul uchun alohida funksiyalarni aniqlashingiz mumkin.

// app/api/users/route.ts
import { NextResponse } from 'next/server';

export async function GET(request: Request) {
 // Ma'lumotlar bazasidan barcha foydalanuvchilarni olish mantig'i
 const users = [{ id: 1, name: 'John Doe' }, { id: 2, name: 'Jane Smith' }]; // Misol ma'lumotlar
 return NextResponse.json(users);
}

export async function POST(request: Request) {
 const data = await request.json(); // So'rov tanasini JSON sifatida tahlil qilish
 // Ma'lumotlar bazasida 'data' yordamida yangi foydalanuvchi yaratish mantig'i
 const newUser = { id: 3, name: data.name, email: data.email }; // Misol
 return NextResponse.json(newUser, { status: 201 }); // Yangi foydalanuvchini 201 Created status kodi bilan qaytarish
}

Tushuntirish:

So'rov ma'lumotlariga kirish

request obyekti kiruvchi so'rov haqidagi turli xil ma'lumotlarga, jumladan sarlavhalar, so'rov parametrlari va so'rov tanasiga kirish imkonini beradi.

Sarlavhalar

So'rov sarlavhalariga request.headers xususiyati yordamida kirishingiz mumkin:

export async function GET(request: Request) {
 const userAgent = request.headers.get('user-agent');
 console.log('User Agent:', userAgent);
 return NextResponse.json({ userAgent });
}

So'rov parametrlari

So'rov parametrlariga kirish uchun URL konstruktoridan foydalanishingiz mumkin:

export async function GET(request: Request) {
 const url = new URL(request.url);
 const searchParams = new URLSearchParams(url.search);
 const id = searchParams.get('id');
 console.log('ID:', id);
 return NextResponse.json({ id });
}

So'rov tanasi

POST, PUT va PATCH so'rovlari uchun so'rov tanasiga kontent turiga qarab request.json() yoki request.text() usullari yordamida kirishingiz mumkin.

export async function POST(request: Request) {
 const data = await request.json();
 console.log('Data:', data);
 return NextResponse.json({ receivedData: data });
}

Javoblarni qaytarish

NextResponse obyekti API javoblarini yaratish uchun ishlatiladi. U sarlavhalarni, status kodlarini va javob tanalarini o'rnatish uchun bir nechta usullarni taqdim etadi.

JSON javoblari

JSON javoblarini qaytarish uchun NextResponse.json() usulidan foydalaning:

return NextResponse.json({ message: 'Success!', data: { name: 'John Doe' } }, { status: 200 });

Matnli javoblar

Oddiy matnli javoblarni qaytarish uchun new Response() konstruktoridan foydalaning:

return new Response('Hello, world!', { status: 200, headers: { 'Content-Type': 'text/plain' } });

Qayta yo'naltirishlar

Foydalanuvchilarni boshqa URL manziliga qayta yo'naltirish uchun NextResponse.redirect() dan foydalaning:

import { redirect } from 'next/navigation';
import { NextResponse } from 'next/server';

export async function GET(request: Request) {
 return NextResponse.redirect(new URL('/new-location', request.url));
}

Sarlavhalarni o'rnatish

Maxsus sarlavhalarni NextResponse.json() yoki new Response() dagi headers opsiyasi yordamida o'rnatishingiz mumkin:

return NextResponse.json({ message: 'Success!' }, { status: 200, headers: { 'Cache-Control': 'no-cache' } });

Middleware integratsiyasi

Middleware sizga so'rov Route Handler tomonidan qayta ishlanishidan oldin kodni ishga tushirish imkonini beradi. Bu autentifikatsiya, avtorizatsiya, jurnallashtirish va boshqa umumiy vazifalar uchun foydalidir.

Middleware yaratish uchun app katalogida yoki istalgan pastki katalogda middleware.ts (yoki middleware.js) nomli fayl yarating. Middleware ushbu katalog va uning pastki kataloglaridagi barcha yo'nalishlarga qo'llaniladi.

// app/middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';

export function middleware(request: NextRequest) {
 const token = request.cookies.get('auth-token');

 if (!token) {
 return NextResponse.redirect(new URL('/login', request.url));
 }

 return NextResponse.next();
}

export const config = {
 matcher: ['/protected/:path*'], // Ushbu middleware'ni /protected/ bilan boshlanadigan yo'llarga qo'llash
};

Tushuntirish:

Xatolarni qayta ishlash

Mustahkam API'lar yaratish uchun xatolarni to'g'ri qayta ishlash juda muhim. Istisnolarni qayta ishlash va tegishli xato javoblarini qaytarish uchun try...catch bloklaridan foydalanishingiz mumkin.

export async function GET(request: Request) {
 try {
 // Xatoni simulyatsiya qilish
 throw new Error('Something went wrong!');
 } catch (error: any) {
 console.error('Error:', error);
 return NextResponse.json({ error: error.message }, { status: 500 });
 }
}

Tushuntirish:

Oqimli javoblar

Route Handlers oqimli javoblarni qo'llab-quvvatlaydi, bu esa mijozga ma'lumotlarni bosqichma-bosqich yuborish imkonini beradi. Bu, ayniqsa, katta ma'lumotlar to'plamlari yoki uzoq davom etadigan jarayonlar uchun foydalidir.

import { Readable } from 'stream';
import { NextResponse } from 'next/server';

async function* generateData() {
 for (let i = 0; i < 10; i++) {
 await new Promise(resolve => setTimeout(resolve, 500)); // Kechikishni simulyatsiya qilish
 yield `Data chunk ${i}\n`;
 }
}

export async function GET(request: Request) {
 const readableStream = Readable.from(generateData());

 return new Response(readableStream, {
 headers: { 'Content-Type': 'text/plain; charset=utf-8' },
 });
}

Tushuntirish:

Autentifikatsiya va Avtorizatsiya

API endpointlaringizni himoyalash juda muhim. Siz autentifikatsiya va avtorizatsiyani middleware yordamida yoki to'g'ridan-to'g'ri Route Handlers ichida amalga oshirishingiz mumkin.

Autentifikatsiya

Autentifikatsiya so'rovni amalga oshirayotgan foydalanuvchining shaxsini tasdiqlaydi. Umumiy autentifikatsiya usullariga quyidagilar kiradi:

Middleware yordamida JWT autentifikatsiyasiga misol:

// app/middleware.ts
import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
import jwt from 'jsonwebtoken';

const secret = process.env.JWT_SECRET || 'your-secret-key'; // Kuchli, tasodifiy yaratilgan maxfiy kalit bilan almashtiring

export function middleware(request: NextRequest) {
 const token = request.cookies.get('auth-token')?.value;

 if (!token) {
 return NextResponse.json({ message: 'Authentication required' }, { status: 401 });
 }

 try {
 jwt.verify(token, secret);
 return NextResponse.next();
 } catch (error) {
 return NextResponse.json({ message: 'Invalid token' }, { status: 401 });
 }
}

export const config = {
 matcher: ['/api/protected/:path*'],
};

Avtorizatsiya

Avtorizatsiya foydalanuvchining qaysi resurslarga kirishiga ruxsat berilganligini aniqlaydi. Bu odatda rollar yoki ruxsatnomalarga asoslanadi.

Siz Route Handlers ichida foydalanuvchining rollari yoki ruxsatnomalarini tekshirish va agar ularda kirish huquqi bo'lmasa, xato qaytarish orqali avtorizatsiyani amalga oshirishingiz mumkin.

// app/api/admin/route.ts
import { NextResponse } from 'next/server';

export async function GET(request: Request) {
 // Foydalanuvchi rolini tokendan yoki sessiyadan olish uchun funksiyangiz bor deb taxmin qilamiz
 const userRole = await getUserRole(request);

 if (userRole !== 'admin') {
 return NextResponse.json({ message: 'Unauthorized' }, { status: 403 });
 }

 // Admin ma'lumotlarini olish mantig'i
 const adminData = { message: 'Admin data' };
 return NextResponse.json(adminData);
}

async function getUserRole(request: Request): Promise {
 // Foydalanuvchi rolini so'rovdan olish uchun haqiqiy mantiq'ingiz bilan almashtiring
 // Bu JWT tokenini tekshirish yoki sessiyani tekshirishni o'z ichiga olishi mumkin
 return 'admin'; // Misol: namoyish uchun qattiq kodlangan rol
}

Route Handlers'ni joylashtirish

Route Handlers siz tanlagan xosting provayderida serverless funksiyalar sifatida joylashtiriladi. Next.js Vercel, Netlify, AWS va boshqalar kabi turli xil joylashtirish platformalarini qo'llab-quvvatlaydi.

Vercel uchun joylashtirish Git repozitoriyangizni Vercel'ga ulash va kodingizni yuklash kabi oddiy. Vercel avtomatik ravishda Next.js loyihangizni aniqlaydi va Route Handlers'ni serverless funksiyalar sifatida joylashtiradi.

Ilg'or texnikalar

Edge Functions

Route Handlers Edge Functions sifatida joylashtirilishi mumkin, ular CDN chekkasida, foydalanuvchilaringizga yaqinroq joyda bajariladi. Bu kechikishni sezilarli darajada kamaytirishi va unumdorlikni oshirishi mumkin.

Route Handler'ni Edge Function sifatida joylashtirish uchun route.ts faylingizga edge runtime'ni qo'shing:

export const runtime = 'edge';

import { NextResponse } from 'next/server';

export async function GET(request: Request) {
 return NextResponse.json({ message: 'Hello from the Edge!' });
}

Server Actions

Server Actions sizga server tomonidagi kodni to'g'ridan-to'g'ri React komponentlaringizdan bajarish imkonini beradi. Route Handlers va Server Actions birgalikda uzluksiz ishlaydi, bu sizga murakkab ilovalarni osongina yaratishga imkon beradi.

Server Action yordamida Route Handler'ni chaqirishga misol:

// app/components/MyComponent.tsx
'use client';
import { useState } from 'react';
import { useRouter } from 'next/navigation';

async function handleSubmit(data: FormData) {
 'use server';

 const name = data.get('name');
 const email = data.get('email');

 const response = await fetch('/api/users', {
 method: 'POST',
 body: JSON.stringify({ name, email }),
 });

 if (response.ok) {
 router.refresh(); // O'zgarishlarni aks ettirish uchun sahifani yangilash
 }
}

export default function MyComponent() {
 const router = useRouter();

 return (
 




); }

Keshlashtirish

Keshlashtirish API endpointlaringizning unumdorligini sezilarli darajada yaxshilashi mumkin. Javoblaringiz brauzerlar va CDN'lar tomonidan qanday keshlanishini nazorat qilish uchun Cache-Control sarlavhasidan foydalanishingiz mumkin.

return NextResponse.json({ message: 'Success!' }, { status: 200, headers: { 'Cache-Control': 'public, max-age=3600' } });

Ushbu misol Cache-Control sarlavhasini public, max-age=3600 ga o'rnatadi, bu brauzerlar va CDN'larga javobni bir soat davomida keshlashtirishni aytadi.

Eng yaxshi amaliyotlar

Haqiqiy dunyo misollari

Route Handlers qanday ishlatilishi mumkinligiga oid bir nechta haqiqiy dunyo misollari:

Xalqaro elektron tijorat misoli: Foydalanuvchining mamlakatiga qarab mahsulot narxlarini olish uchun ishlatiladigan Route Handler. Endpoint so'rovning geolokatsiyasidan (IP manzilidan olingan) foydalanib, foydalanuvchining joylashuvini aniqlashi va narxlarni tegishli valyutada qaytarishi mumkin. Bu mahalliylashtirilgan xarid qilish tajribasiga hissa qo'shadi.

Global autentifikatsiya misoli: Butun dunyo bo'ylab foydalanuvchilar uchun ko'p faktorli autentifikatsiyani (MFA) amalga oshiradigan Route Handler. Bu turli mintaqalarning maxfiylik qoidalari va telekommunikatsiya infratuzilmalarini hurmat qilgan holda SMS kodlarini yuborish yoki autentifikator ilovalaridan foydalanishni o'z ichiga olishi mumkin.

Ko'p tilli kontent yetkazib berish: Foydalanuvchining afzal ko'rgan tilida kontent yetkazib beradigan Route Handler. Buni so'rovdagi `Accept-Language` sarlavhasidan aniqlash mumkin. Ushbu misol to'g'ri UTF-8 kodlash va kerak bo'lganda o'ngdan chapga yoziladigan tillarni qo'llab-quvvatlash zarurligini ta'kidlaydi.

Xulosa

Next.js Route Handlers to'g'ridan-to'g'ri Next.js ilovangiz ichida API endpointlarini yaratishning kuchli va moslashuvchan usulini taqdim etadi. Route Handlers'dan foydalanib, siz osongina mustahkam API'lar yaratishingiz, backend mantiq'ingizni React komponentlaringiz bilan bir joyda joylashtirishingiz va middleware, oqimli uzatish va Edge Functions kabi xususiyatlardan foydalanishingiz mumkin.

Ushbu keng qamrovli qo'llanma asosiy sozlashdan tortib ilg'or texnikalargacha bo'lgan hamma narsani qamrab oldi. Ushbu qo'llanmada keltirilgan eng yaxshi amaliyotlarga rioya qilish orqali siz xavfsiz, unumdor va saqlanib qoladigan yuqori sifatli API'lar yarata olasiz.