Latviešu

Uzziniet, kā izveidot jaudīgus API galapunktus, izmantojot Next.js Maršruta Apstrādātājus. Šī rokasgrāmata aptver visu, sākot no pamata iestatīšanas līdz progresīvām tehnikām, ar praktiskiem piemēriem un labākajām praksēm.

Next.js Maršruta Apstrādātāji (Route Handlers): Visaptveroša Rokasgrāmata API Galapunktu Izveidei

Next.js ir revolucionizējis veidu, kā mēs veidojam tīmekļa lietojumprogrammas, ar tādām jaudīgām funkcijām kā servera puses renderēšana, statisko vietņu ģenerēšana un tagad - Maršruta Apstrādātāji (Route Handlers). Maršruta Apstrādātāji nodrošina elastīgu un efektīvu veidu, kā izveidot API galapunktus tieši jūsu Next.js lietojumprogrammā. Šī rokasgrāmata pēta Maršruta Apstrādātāju konceptu, to priekšrocības un to, kā tos efektīvi izmantot, lai veidotu stabilus API.

Kas ir Next.js Maršruta Apstrādātāji (Route Handlers)?

Maršruta Apstrādātāji ir funkcijas, kas definētas Next.js projekta app direktorijā un kas apstrādā ienākošos HTTP pieprasījumus. Atšķirībā no vecākās pages/api pieejas (kas izmanto API maršrutus), Maršruta Apstrādātāji piedāvā racionalizētāku un elastīgāku veidu, kā definēt API galapunktus līdzās jūsu React komponentēm. Tās būtībā ir bezservera funkcijas, kas tiek izpildītas uz perimetra (edge) vai jūsu izvēlētajā servera vidē.

Uztveriet Maršruta Apstrādātājus kā jūsu Next.js lietojumprogrammas aizmugursistēmas loģiku, kas atbild par pieprasījumu apstrādi, mijiedarbību ar datu bāzēm un atbilžu atgriešanu.

Maršruta Apstrādātāju Izmantošanas Priekšrocības

Jūsu Next.js Projekta Iestatīšana

Pirms iedziļināties Maršruta Apstrādātājos, pārliecinieties, ka jums ir iestatīts Next.js projekts ar app direktoriju. Ja sākat jaunu projektu, izmantojiet šādu komandu:

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

Iestatīšanas procesa laikā izvēlieties app direktoriju, lai aktivizētu jauno maršrutēšanas sistēmu.

Pirmā Maršruta Apstrādātāja Izveide

Izveidosim vienkāršu API galapunktu, kas atgriež JSON atbildi. Izveidojiet jaunu direktoriju app direktorijā, piemēram, /app/api/hello. Šajā direktorijā izveidojiet failu ar nosaukumu route.ts (vai route.js, ja neizmantojat TypeScript).

Šeit ir kods jūsu pirmajam Maršruta Apstrādātājam:

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

Paskaidrojums:

Tagad jūs varat piekļūt šim galapunktam, pārejot uz /api/hello savā pārlūkprogrammā vai izmantojot rīku, piemēram, curl vai Postman.

Dažādu HTTP Metožu Apstrāde

Maršruta Apstrādātāji atbalsta dažādas HTTP metodes, piemēram, GET, POST, PUT, DELETE, PATCH un OPTIONS. Jūs varat definēt atsevišķas funkcijas katrai metodei vienā route.ts failā.

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

export async function GET(request: Request) {
 // Loģika, lai iegūtu visus lietotājus no datu bāzes
 const users = [{ id: 1, name: 'John Doe' }, { id: 2, name: 'Jane Smith' }]; // Datu piemērs
 return NextResponse.json(users);
}

export async function POST(request: Request) {
 const data = await request.json(); // Parsē pieprasījuma ķermeni kā JSON
 // Loģika, lai izveidotu jaunu lietotāju datu bāzē, izmantojot 'data'
 const newUser = { id: 3, name: data.name, email: data.email }; // Piemērs
 return NextResponse.json(newUser, { status: 201 }); // Atgriež jauno lietotāju ar 201 Created statusa kodu
}

Paskaidrojums:

Piekļuve Pieprasījuma Datiem

request objekts nodrošina piekļuvi dažādai informācijai par ienākošo pieprasījumu, ieskaitot galvenes, vaicājuma parametrus un pieprasījuma ķermeni.

Galvenes (Headers)

Jūs varat piekļūt pieprasījuma galvenēm, izmantojot request.headers īpašību:

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

Vaicājuma Parametri (Query Parameters)

Lai piekļūtu vaicājuma parametriem, varat izmantot URL konstruktoru:

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

Pieprasījuma Ķermenis (Request Body)

POST, PUT un PATCH pieprasījumiem jūs varat piekļūt pieprasījuma ķermenim, izmantojot request.json() vai request.text() metodes, atkarībā no satura veida.

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

Atbilžu Atgriešana

NextResponse objekts tiek izmantots API atbilžu konstruēšanai. Tas nodrošina vairākas metodes galveņu, statusa kodu un atbildes ķermeņu iestatīšanai.

JSON Atbildes

Izmantojiet NextResponse.json() metodi, lai atgrieztu JSON atbildes:

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

Teksta Atbildes

Izmantojiet new Response() konstruktoru, lai atgrieztu vienkārša teksta atbildes:

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

Pāradresācijas (Redirects)

Izmantojiet NextResponse.redirect(), lai pāradresētu lietotājus uz citu URL:

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

Galveņu Iestatīšana

Jūs varat iestatīt pielāgotas galvenes, izmantojot headers opciju NextResponse.json() vai new Response():

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

Starpprogrammatūras (Middleware) Integrācija

Starpprogrammatūra ļauj palaist kodu pirms pieprasījuma apstrādes jūsu Maršruta Apstrādātājā. Tas ir noderīgi autentifikācijai, autorizācijai, žurnalēšanai un citiem šķērsgriezuma jautājumiem.

Lai izveidotu starpprogrammatūru, izveidojiet failu ar nosaukumu middleware.ts (vai middleware.js) app direktorijā vai jebkurā apakšdirektorijā. Starpprogrammatūra tiks piemērota visiem maršrutiem šajā direktorijā un tās apakšdirektorijās.

// 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*'], // Piemērot šo starpprogrammatūru ceļiem, kas sākas ar /protected/
};

Paskaidrojums:

Kļūdu Apstrāde

Pareiza kļūdu apstrāde ir būtiska, lai veidotu stabilus API. Jūs varat izmantot try...catch blokus, lai apstrādātu izņēmumus un atgrieztu atbilstošas kļūdu atbildes.

export async function GET(request: Request) {
 try {
 // Simulējam kļūdu
 throw new Error('Something went wrong!');
 } catch (error: any) {
 console.error('Error:', error);
 return NextResponse.json({ error: error.message }, { status: 500 });
 }
}

Paskaidrojums:

Straumēšanas Atbildes (Streaming Responses)

Maršruta Apstrādātāji atbalsta straumēšanas atbildes, kas ļauj jums nosūtīt datus klientam pakāpeniski. Tas ir īpaši noderīgi lieliem datu apjomiem vai ilgiem procesiem.

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)); // Simulējam aizkavi
 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' },
 });
}

Paskaidrojums:

Autentifikācija un Autorizācija

Jūsu API galapunktu drošība ir ļoti svarīga. Jūs varat ieviest autentifikāciju un autorizāciju, izmantojot starpprogrammatūru vai tieši savos Maršruta Apstrādātājos.

Autentifikācija

Autentifikācija pārbauda pieprasījumu veicošā lietotāja identitāti. Izplatītākās autentifikācijas metodes ietver:

Šeit ir piemērs JWT autentifikācijai, izmantojot starpprogrammatūru:

// 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'; // Aizstājiet ar spēcīgu, nejauši ģenerētu noslēpumu

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*'],
};

Autorizācija

Autorizācija nosaka, kādiem resursiem lietotājs drīkst piekļūt. To parasti pamato ar lomām vai atļaujām.

Jūs varat ieviest autorizāciju savos Maršruta Apstrādātājos, pārbaudot lietotāja lomas vai atļaujas un atgriežot kļūdu, ja viņiem nav piekļuves.

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

export async function GET(request: Request) {
 // Pieņemsim, ka jums ir funkcija, kas iegūst lietotāja lomu no marķiera vai sesijas
 const userRole = await getUserRole(request);

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

 // Loģika, lai iegūtu administratora datus
 const adminData = { message: 'Admin data' };
 return NextResponse.json(adminData);
}

async function getUserRole(request: Request): Promise {
 // Aizstājiet ar savu faktisko loģiku, lai iegūtu lietotāja lomu no pieprasījuma
 // Tas varētu ietvert JWT marķiera pārbaudi vai sesijas pārbaudi
 return 'admin'; // Piemērs: fiksēta loma demonstrācijai
}

Maršruta Apstrādātāju Ieviešana (Deploying)

Maršruta Apstrādātāji tiek ieviesti kā bezservera funkcijas jūsu izvēlētajā mitināšanas pakalpojumu sniedzējā. Next.js atbalsta dažādas ieviešanas platformas, tostarp Vercel, Netlify, AWS un citas.

Vercel gadījumā ieviešana ir tikpat vienkārša kā savas Git repozitorijas savienošana ar Vercel un koda augšupielāde. Vercel automātiski atpazīst jūsu Next.js projektu un ievieš jūsu Maršruta Apstrādātājus kā bezservera funkcijas.

Progresīvas Tehnikas

Perimetra Funkcijas (Edge Functions)

Maršruta Apstrādātājus var ieviest kā Perimetra Funkcijas, kas tiek izpildītas CDN perimetrā, tuvāk jūsu lietotājiem. Tas var ievērojami samazināt latentumu un uzlabot veiktspēju.

Lai ieviestu Maršruta Apstrādātāju kā Perimetra Funkciju, pievienojiet edge izpildlaiku (runtime) savam route.ts failam:

export const runtime = 'edge';

import { NextResponse } from 'next/server';

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

Servera Darbības (Server Actions)

Servera Darbības ļauj jums izpildīt servera puses kodu tieši no jūsu React komponentēm. Maršruta Apstrādātāji un Servera Darbības darbojas nevainojami kopā, ļaujot jums viegli veidot sarežģītas lietojumprogrammas.

Šeit ir piemērs, kā izmantot Servera Darbību, lai izsauktu Maršruta Apstrādātāju:

// 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(); // Atsvaidzina lapu, lai atspoguļotu izmaiņas
 }
}

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

 return (
 




); }

Kešatmiņas Izmantošana (Caching)

Kešatmiņas izmantošana var ievērojami uzlabot jūsu API galapunktu veiktspēju. Jūs varat izmantot Cache-Control galveni, lai kontrolētu, kā jūsu atbildes tiek kešotas pārlūkprogrammās un CDN.

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

Šis piemērs iestata Cache-Control galveni uz public, max-age=3600, kas norāda pārlūkprogrammām un CDN kešot atbildi vienu stundu.

Labākās Prakses

Reālās Dzīves Piemēri

Šeit ir daži reālās dzīves piemēri, kā var izmantot Maršruta Apstrādātājus:

Starptautiskās e-komercijas piemērs: Maršruta Apstrādātājs, kas tiek izmantots, lai iegūtu produktu cenas, pamatojoties uz lietotāja valsti. Galapunkts varētu izmantot pieprasījuma ģeogrāfisko atrašanās vietu (kas iegūta no IP adreses), lai noteiktu lietotāja atrašanās vietu un atgrieztu cenas atbilstošajā valūtā. Tas veicina lokalizētu iepirkšanās pieredzi.

Globālās autentifikācijas piemērs: Maršruta Apstrādātājs, kas īsteno daudzfaktoru autentifikāciju (MFA) lietotājiem visā pasaulē. Tas varētu ietvert SMS kodu sūtīšanu vai autentifikācijas lietotņu izmantošanu, vienlaikus ievērojot dažādu reģionu privātuma noteikumus un telekomunikāciju infrastruktūras.

Daudzvalodu satura piegāde: Maršruta Apstrādātājs, kas piegādā saturu lietotāja vēlamajā valodā. To var noteikt no Accept-Language galvenes pieprasījumā. Šis piemērs uzsver nepieciešamību pēc pareizas UTF-8 kodēšanas un atbalsta valodām, kas tiek rakstītas no labās uz kreiso pusi, ja nepieciešams.

Noslēgums

Next.js Maršruta Apstrādātāji nodrošina jaudīgu un elastīgu veidu, kā izveidot API galapunktus tieši jūsu Next.js lietojumprogrammā. Izmantojot Maršruta Apstrādātājus, jūs varat viegli veidot stabilus API, novietot savu aizmugursistēmas loģiku kopā ar React komponentēm un izmantot tādas funkcijas kā starpprogrammatūra, straumēšana un Perimetra Funkcijas.

Šī visaptverošā rokasgrāmata ir aptvērusi visu, sākot no pamata iestatīšanas līdz progresīvām tehnikām. Sekojot šajā rokasgrāmatā izklāstītajām labākajām praksēm, jūs varat veidot augstas kvalitātes API, kas ir droši, veiktspējīgi un viegli uzturami.