Latviešu

Izpētiet Next.js starpniekprogrammatūru – jaudīgu funkciju ienākošo pieprasījumu pārtveršanai un modificēšanai. Uzziniet, kā ieviest autentifikāciju, autorizāciju, pāradresāciju un A/B testēšanu ar praktiskiem piemēriem.

Next.js Starpniekprogrammatūra: Pieprasījumu Pārtveršanas Apgūšana Dinamiskām Lietotnēm

Next.js starpniekprogrammatūra nodrošina elastīgu un jaudīgu veidu, kā pārtvert un modificēt ienākošos pieprasījumus, pirms tie sasniedz jūsu maršrutus. Šī iespēja ļauj jums ieviest plašu funkciju klāstu, sākot ar autentifikāciju un autorizāciju līdz pāradresācijai un A/B testēšanai, vienlaikus optimizējot veiktspēju. Šī visaptverošā rokasgrāmata iepazīstinās jūs ar Next.js starpniekprogrammatūras pamatkoncepcijām un parādīs, kā to efektīvi izmantot.

Kas ir Next.js Starpniekprogrammatūra?

Starpniekprogrammatūra Next.js ir funkcija, kas tiek izpildīta pirms pieprasījuma pabeigšanas. Tā ļauj jums:

Starpniekprogrammatūras funkcijas tiek definētas middleware.ts (vai middleware.js) failā jūsu projekta saknes direktorijā. Tās tiek izpildītas katram maršrutam jūsu lietotnē vai konkrētiem maršrutiem, pamatojoties uz konfigurējamiem meklētājiem (matchers).

Pamatjēdzieni un Priekšrocības

Pieprasījuma (Request) Objekts

request objekts nodrošina piekļuvi informācijai par ienākošo pieprasījumu, ieskaitot:

Atbildes (Response) Objekts

Starpniekprogrammatūras funkcijas atgriež Response objektu, lai kontrolētu pieprasījuma iznākumu. Jūs varat izmantot šādas atbildes:

Meklētāji (Matchers)

Meklētāji ļauj norādīt, kuriem maršrutiem jūsu starpniekprogrammatūra ir jāpiemēro. Jūs varat definēt meklētājus, izmantojot regulārās izteiksmes vai ceļu modeļus. Tas nodrošina, ka jūsu starpniekprogrammatūra darbojas tikai tad, kad tas ir nepieciešams, uzlabojot veiktspēju un samazinot papildu slodzi.

Edge Runtime

Next.js starpniekprogrammatūra darbojas Edge Runtime vidē, kas ir viegla JavaScript izpildes vide, ko var izvietot tuvu jūsu lietotājiem. Šī tuvība samazina latentumu un uzlabo jūsu lietotnes kopējo veiktspēju, īpaši globāli izkliedētiem lietotājiem. Edge Runtime ir pieejams Vercel Edge tīklā un citās saderīgās platformās. Edge Runtime ir daži ierobežojumi, īpaši attiecībā uz Node.js API izmantošanu.

Praktiski Piemēri: Starpniekprogrammatūras Funkciju Ieviešana

1. Autentifikācija

Autentifikācijas starpniekprogrammatūru var izmantot, lai aizsargātu maršrutus, kuriem nepieciešama lietotāju pieteikšanās. Šeit ir piemērs, kā ieviest autentifikāciju, izmantojot sīkdatnes:


// 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: ['/dashboard/:path*'],
}

Šī starpniekprogrammatūra pārbauda auth_token sīkdatnes esamību. Ja sīkdatne nav atrasta, lietotājs tiek pāradresēts uz /login lapu. config.matcher norāda, ka šai starpniekprogrammatūrai jādarbojas tikai maršrutos zem /dashboard.

Globālā perspektīva: Pielāgojiet autentifikācijas loģiku, lai atbalstītu dažādas autentifikācijas metodes (piem., OAuth, JWT) un integrētos ar dažādiem identitātes nodrošinātājiem (piem., Google, Facebook, Azure AD), lai apmierinātu lietotāju vajadzības no dažādiem reģioniem.

2. Autorizācija

Autorizācijas starpniekprogrammatūru var izmantot, lai kontrolētu piekļuvi resursiem, pamatojoties uz lietotāju lomām vai atļaujām. Piemēram, jums varētu būt administratora panelis, kuram var piekļūt tikai konkrēti lietotāji.


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

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

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

 // Piemērs: Iegūstiet lietotāju lomas no API (aizstājiet ar savu faktisko loģiku)
 const userResponse = await fetch('https://api.example.com/userinfo', {
 headers: {
 Authorization: `Bearer ${token}`,
 },
 });
 const userData = await userResponse.json();

 if (userData.role !== 'admin') {
 return NextResponse.redirect(new URL('/unauthorized', request.url))
 }

 return NextResponse.next()
}

export const config = {
 matcher: ['/admin/:path*'],
}

Šī starpniekprogrammatūra iegūst lietotāja lomu un pārbauda, vai viņam ir admin loma. Ja nē, viņš tiek pāradresēts uz /unauthorized lapu. Šis piemērs izmanto viettura API galapunktu. Aizstājiet `https://api.example.com/userinfo` ar savu faktisko autentifikācijas servera galapunktu.

Globālā perspektīva: Apstrādājot lietotāju datus, ievērojiet datu privātuma noteikumus (piem., GDPR, CCPA). Ieviesiet atbilstošus drošības pasākumus, lai aizsargātu sensitīvu informāciju un nodrošinātu atbilstību vietējiem likumiem.

3. Pāradresācija

Pāradresācijas starpniekprogrammatūru var izmantot, lai pāradresētu lietotājus, pamatojoties uz viņu atrašanās vietu, valodu vai citiem kritērijiem. Piemēram, jūs varētu pāradresēt lietotājus uz lokalizētu vietnes versiju, pamatojoties uz viņu IP adresi.


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

export function middleware(request: NextRequest) {
 const country = request.geo?.country || 'US'; // Ja ģeolokācija neizdodas, pēc noklusējuma izmanto ASV

 if (country === 'DE') {
 return NextResponse.redirect(new URL('/de', request.url))
 }

 if (country === 'FR') {
 return NextResponse.redirect(new URL('/fr', request.url))
 }

 return NextResponse.next()
}

export const config = {
 matcher: ['/'],
}

Šī starpniekprogrammatūra pārbauda lietotāja valsti, pamatojoties uz viņa IP adresi, un pāradresē viņu uz atbilstošo lokalizēto vietnes versiju (/de Vācijai, /fr Francijai). Ja ģeolokācija neizdodas, pēc noklusējuma tiek izmantota ASV versija. Ņemiet vērā, ka tas ir atkarīgs no tā, vai ir pieejama ģeolokācijas īpašība (piem., izvietojot Vercel platformā).

Globālā perspektīva: Nodrošiniet, lai jūsu vietne atbalstītu vairākas valodas un valūtas. Nodrošiniet lietotājiem iespēju manuāli izvēlēties vēlamo valodu vai reģionu. Katrai lokalizācijai izmantojiet atbilstošus datuma un laika formātus.

4. A/B Testēšana

Starpniekprogrammatūru var izmantot, lai ieviestu A/B testēšanu, nejauši piešķirot lietotājus dažādiem lapas variantiem un sekojot līdzi viņu uzvedībai. Šeit ir vienkāršots piemērs:


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

function getRandomVariant() {
 return Math.random() < 0.5 ? 'A' : 'B';
}

export function middleware(request: NextRequest) {
 let variant = request.cookies.get('variant')?.value;

 if (!variant) {
 variant = getRandomVariant();
 const response = NextResponse.next();
 response.cookies.set('variant', variant);
 return response;
 }

 if (variant === 'B') {
 return NextResponse.rewrite(new URL('/variant-b', request.url));
 }

 return NextResponse.next();
}

export const config = {
 matcher: ['/'],
}

Šī starpniekprogrammatūra piešķir lietotājus vai nu 'A', vai 'B' variantam. Ja lietotājam vēl nav variant sīkdatnes, tā tiek nejauši piešķirta un iestatīta. Lietotāji, kuriem piešķirts 'B' variants, tiek pārrakstīti uz /variant-b lapu. Jums būtu tad jāseko katra varianta veiktspējai, lai noteiktu, kurš no tiem ir efektīvāks.

Globālā perspektīva: Projektējot A/B testus, ņemiet vērā kultūras atšķirības. Tas, kas labi darbojas vienā reģionā, var neatbilst lietotāju gaumei citā. Pārliecinieties, ka jūsu A/B testēšanas platforma atbilst privātuma noteikumiem dažādos reģionos.

5. Funkciju Karodziņi (Feature Flags)

Funkciju karodziņi ļauj jums ieslēgt vai izslēgt funkcijas jūsu lietotnē, neizvietojot jaunu kodu. Starpniekprogrammatūru var izmantot, lai noteiktu, vai lietotājam ir jābūt piekļuvei konkrētai funkcijai, pamatojoties uz viņa lietotāja ID, atrašanās vietu vai citiem kritērijiem.


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

export async function middleware(request: NextRequest) {
 // Piemērs: Iegūstiet funkciju karodziņus no API
 const featureFlagsResponse = await fetch('https://api.example.com/featureflags', {
 headers: {
 'X-User-Id': 'user123',
 },
 });
 const featureFlags = await featureFlagsResponse.json();

 if (featureFlags.new_feature_enabled) {
 // Iespējot jauno funkciju
 return NextResponse.next();
 } else {
 // Atspējot jauno funkciju (piem., pāradresēt uz alternatīvu lapu)
 return NextResponse.redirect(new URL('/alternative-page', request.url));
 }
}

export const config = {
 matcher: ['/new-feature'],
}

Šī starpniekprogrammatūra iegūst funkciju karodziņus no API un pārbauda, vai ir iestatīts new_feature_enabled karodziņš. Ja ir, lietotājs var piekļūt /new-feature lapai. Pretējā gadījumā viņš tiek pāradresēts uz /alternative-page.

Globālā perspektīva: Izmantojiet funkciju karodziņus, lai pakāpeniski ieviestu jaunas funkcijas lietotājiem dažādos reģionos. Tas ļauj jums pārraudzīt veiktspēju un novērst jebkādas problēmas, pirms funkcija tiek izlaista plašākai auditorijai. Tāpat nodrošiniet, ka jūsu funkciju karodziņu sistēma ir globāli mērogojama un nodrošina konsekventus rezultātus neatkarīgi no lietotāja atrašanās vietas. Apsveriet reģionālos regulatīvos ierobežojumus funkciju ieviešanai.

Padziļinātas Tehnikas

Starpniekprogrammatūru Sasaistīšana (Chaining)

Jūs varat sasaistīt vairākas starpniekprogrammatūras funkcijas, lai veiktu virkni darbību ar pieprasījumu. Tas var būt noderīgi, lai sadalītu sarežģītu loģiku mazākos, vieglāk pārvaldāmos moduļos.


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

export function middleware(request: NextRequest) {
 const response = NextResponse.next();

 // Pirmā starpniekprogrammatūras funkcija
 const token = request.cookies.get('auth_token');
 if (!token) {
 return NextResponse.redirect(new URL('/login', request.url))
 }

 // Otrā starpniekprogrammatūras funkcija
 response.headers.set('x-middleware-custom', 'value');

 return response;
}

export const config = {
 matcher: ['/dashboard/:path*'],
}

Šis piemērs parāda divas starpniekprogrammatūras vienā. Pirmā veic autentifikāciju, bet otrā iestata pielāgotu galveni.

Vides Mainīgo Izmantošana

Glabājiet sensitīvu informāciju, piemēram, API atslēgas un datu bāzes akreditācijas datus, vides mainīgajos, nevis cietkodējot tos savās starpniekprogrammatūras funkcijās. Tas uzlabo drošību un atvieglo jūsu lietotnes konfigurācijas pārvaldību.


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

const API_KEY = process.env.API_KEY;

export async function middleware(request: NextRequest) {
 const response = await fetch('https://api.example.com/data', {
 headers: {
 'X-API-Key': API_KEY,
 },
 });

 // ...
}

export const config = {
 matcher: ['/data'],
}

Šajā piemērā API_KEY tiek iegūta no vides mainīgā.

Kļūdu Apstrāde

Ieviesiet robustu kļūdu apstrādi savās starpniekprogrammatūras funkcijās, lai novērstu neparedzētas kļūdas, kas varētu izraisīt jūsu lietotnes avāriju. Izmantojiet try...catch blokus, lai notvertu izņēmumus un atbilstoši reģistrētu kļūdas.


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

export async function middleware(request: NextRequest) {
 try {
 const response = await fetch('https://api.example.com/data');
 // ...
 } catch (error) {
 console.error('Error fetching data:', error);
 return NextResponse.error(); // Vai pāradresēt uz kļūdas lapu
 }
}

export const config = {
 matcher: ['/data'],
}

Labākās Prakses

Biežāko Problēmu Novēršana

Noslēgums

Next.js starpniekprogrammatūra ir jaudīgs rīks dinamisku un personalizētu tīmekļa lietotņu veidošanai. Apgūstot pieprasījumu pārtveršanu, jūs varat ieviest plašu funkciju klāstu, sākot no autentifikācijas un autorizācijas līdz pāradresācijai un A/B testēšanai. Ievērojot šajā rokasgrāmatā izklāstītās labākās prakses, jūs varat izmantot Next.js starpniekprogrammatūru, lai izveidotu augstas veiktspējas, drošas un mērogojamas lietotnes, kas atbilst jūsu globālās lietotāju bāzes vajadzībām. Izmantojiet starpniekprogrammatūras spēku, lai atklātu jaunas iespējas savos Next.js projektos un sniegtu izcilu lietotāja pieredzi.