Magyar

Ismerje meg a Next.js middleware-t, egy hatékony funkciót a bejövő kérések elfogására és módosítására. Tanulja meg, hogyan valósíthat meg hitelesítést, jogosultságkezelést, átirányítást és A/B tesztelést gyakorlati példákon keresztül.

Next.js Middleware: A kérések elfogásának mesteri szintű alkalmazása dinamikus alkalmazásokban

A Next.js middleware rugalmas és hatékony módszert kínál a bejövő kérések elfogására és módosítására, mielőtt azok elérnék az útvonalakat (route-okat). Ez a képesség lehetővé teszi, hogy számos funkciót implementáljon, a hitelesítéstől és jogosultságkezeléstől kezdve az átirányításon át az A/B tesztelésig, mindezt a teljesítmény optimalizálása mellett. Ez az átfogó útmutató végigvezeti Önt a Next.js middleware alapkoncepcióin, és bemutatja, hogyan használhatja azt hatékonyan.

Mi az a Next.js Middleware?

A Next.js-ben a middleware egy olyan függvény, amely a kérés teljesítése előtt fut le. Lehetővé teszi, hogy:

A middleware függvényeket a projekt gyökérkönyvtárában található middleware.ts (vagy middleware.js) fájlban definiáljuk. Ezek az alkalmazás minden útvonalára lefutnak, vagy konfigurálható `matcher`-ek alapján csak bizonyos útvonalakra.

Kulcsfogalmak és előnyök

Request objektum

A request objektum hozzáférést biztosít a bejövő kérés információihoz, beleértve:

Response objektum

A middleware függvények egy Response objektumot adnak vissza a kérés kimenetelének vezérlésére. A következő válaszokat használhatja:

Matcher-ek

A `matcher`-ek lehetővé teszik annak meghatározását, hogy a middleware mely útvonalakra vonatkozzon. A `matcher`-eket reguláris kifejezésekkel vagy útvonalmintákkal definiálhatja. Ez biztosítja, hogy a middleware csak akkor fusson, amikor szükséges, javítva a teljesítményt és csökkentve a terhelést.

Edge Runtime

A Next.js middleware az Edge Runtime-on fut, amely egy könnyűsúlyú JavaScript futtatási környezet, és a felhasználókhoz közel telepíthető. Ez a közelség minimalizálja a késleltetést és javítja az alkalmazás általános teljesítményét, különösen a globálisan elosztott felhasználók esetében. Az Edge Runtime elérhető a Vercel Edge Network-ön és más kompatibilis platformokon. Az Edge Runtime-nak vannak korlátai, különösen a Node.js API-k használatában.

Gyakorlati példák: Middleware funkciók implementálása

1. Hitelesítés

A hitelesítési middleware használható olyan útvonalak védelmére, amelyekhez a felhasználóknak be kell jelentkezniük. Íme egy példa a hitelesítés megvalósítására sütik segítségével:


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

Ez a middleware ellenőrzi az auth_token süti meglétét. Ha a süti nem található, a felhasználó átirányításra kerül a /login oldalra. A config.matcher meghatározza, hogy ez a middleware csak a /dashboard alatti útvonalakra fusson.

Globális perspektíva: Igazítsa a hitelesítési logikát a különböző hitelesítési módszerek (pl. OAuth, JWT) támogatásához, és integrálja a különböző identitásszolgáltatókkal (pl. Google, Facebook, Azure AD), hogy a különböző régiókból származó felhasználókat is kiszolgálja.

2. Jogosultságkezelés

A jogosultságkezelési middleware használható az erőforrásokhoz való hozzáférés szabályozására felhasználói szerepkörök vagy engedélyek alapján. Például lehet egy adminisztrátori felület, amelyhez csak meghatározott felhasználók férhetnek hozzá.


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

 // Példa: Felhasználói szerepkörök lekérése egy API-ból (cserélje le a saját logikájára)
 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*'],
}

Ez a middleware lekéri a felhasználó szerepkörét, és ellenőrzi, hogy rendelkezik-e admin szerepkörrel. Ha nem, akkor átirányításra kerül egy /unauthorized oldalra. Ez a példa egy helyettesítő API végpontot használ. Cserélje le a `https://api.example.com/userinfo` címet a tényleges hitelesítési szerver végpontjára.

Globális perspektíva: A felhasználói adatok kezelésekor vegye figyelembe az adatvédelmi előírásokat (pl. GDPR, CCPA). Védje a bizalmas információkat megfelelő biztonsági intézkedésekkel, és biztosítsa a helyi törvényeknek való megfelelést.

3. Átirányítás

Az átirányítási middleware használható a felhasználók átirányítására a tartózkodási helyük, nyelvük vagy más kritériumok alapján. Például átirányíthatja a felhasználókat a webhelyének egy lokalizált verziójára az IP-címük alapján.


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

export function middleware(request: NextRequest) {
 const country = request.geo?.country || 'US'; // Alapértelmezésben USA, ha a földrajzi helymeghatározás sikertelen

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

Ez a middleware az IP-cím alapján ellenőrzi a felhasználó országát, és átirányítja őket a webhely megfelelő lokalizált verziójára (/de Németország, /fr Franciaország esetén). Ha a földrajzi helymeghatározás sikertelen, alapértelmezés szerint az amerikai verziót használja. Vegye figyelembe, hogy ez attól függ, hogy a `geo` tulajdonság rendelkezésre áll-e (pl. Vercel-re történő telepítés esetén).

Globális perspektíva: Győződjön meg róla, hogy a webhelye több nyelvet és pénznemet támogat. Biztosítson lehetőséget a felhasználóknak, hogy manuálisan válasszák ki a preferált nyelvet vagy régiót. Használjon megfelelő dátum- és időformátumokat minden területi beállításhoz.

4. A/B tesztelés

A middleware használható A/B tesztelés megvalósítására azáltal, hogy véletlenszerűen hozzárendeli a felhasználókat egy oldal különböző változataihoz, és nyomon követi a viselkedésüket. Íme egy egyszerűsített példa:


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

Ez a middleware a felhasználókat vagy az 'A', vagy a 'B' változathoz rendeli. Ha egy felhasználónak még nincs variant sütije, egyet véletlenszerűen hozzárendel és beállít. A 'B' változathoz rendelt felhasználók átírásra kerülnek a /variant-b oldalra. Ezután nyomon követheti az egyes változatok teljesítményét, hogy megállapítsa, melyik a hatékonyabb.

Globális perspektíva: Vegye figyelembe a kulturális különbségeket az A/B tesztek tervezésekor. Ami az egyik régióban jól működik, nem biztos, hogy a másikban is rezonál a felhasználókkal. Győződjön meg róla, hogy az A/B tesztelési platformja megfelel a különböző régiók adatvédelmi előírásainak.

5. Funkciókapcsolók (Feature Flags)

A funkciókapcsolók (feature flags) lehetővé teszik, hogy új kód telepítése nélkül engedélyezzen vagy tiltsa le a funkciókat az alkalmazásában. A middleware segítségével meghatározható, hogy egy felhasználó hozzáférhet-e egy adott funkcióhoz a felhasználói azonosítója, tartózkodási helye vagy más kritériumok alapján.


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

export async function middleware(request: NextRequest) {
 // Példa: Funkciókapcsolók lekérése egy API-ból
 const featureFlagsResponse = await fetch('https://api.example.com/featureflags', {
 headers: {
 'X-User-Id': 'user123',
 },
 });
 const featureFlags = await featureFlagsResponse.json();

 if (featureFlags.new_feature_enabled) {
 // Az új funkció engedélyezése
 return NextResponse.next();
 } else {
 // Az új funkció letiltása (pl. átirányítás egy alternatív oldalra)
 return NextResponse.redirect(new URL('/alternative-page', request.url));
 }
}

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

Ez a middleware funkciókapcsolókat kér le egy API-ból, és ellenőrzi, hogy a new_feature_enabled kapcsoló be van-e állítva. Ha igen, a felhasználó hozzáférhet a /new-feature oldalhoz. Ellenkező esetben átirányításra kerül egy /alternative-page oldalra.

Globális perspektíva: Használjon funkciókapcsolókat az új funkciók fokozatos bevezetésére a különböző régiókban élő felhasználók számára. Ez lehetővé teszi a teljesítményfigyelést és a problémák kezelését, mielőtt a funkciót szélesebb közönség számára kiadná. Győződjön meg arról is, hogy a funkciókapcsoló rendszere globálisan skálázódik és konzisztens eredményeket biztosít a felhasználó tartózkodási helyétől függetlenül. Vegye figyelembe a funkciók bevezetésére vonatkozó regionális szabályozási korlátozásokat.

Haladó technikák

Middleware-ek láncolása

Több middleware függvényt is összeláncolhat, hogy egy sor műveletet hajtson végre egy kérésen. Ez hasznos lehet a bonyolult logika kisebb, jobban kezelhető modulokra bontásához.


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

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

 // Első middleware függvény
 const token = request.cookies.get('auth_token');
 if (!token) {
 return NextResponse.redirect(new URL('/login', request.url))
 }

 // Második middleware függvény
 response.headers.set('x-middleware-custom', 'value');

 return response;
}

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

Ez a példa két middleware-t mutat be egyben. Az első hitelesítést végez, a második pedig egy egyéni fejlécet állít be.

Környezeti változók használata

Az érzékeny információkat, mint például az API kulcsokat és az adatbázis hitelesítő adatait, környezeti változókban tárolja, ahelyett, hogy keményen kódolná őket a middleware függvényeibe. Ez javítja a biztonságot és megkönnyíti az alkalmazás konfigurációjának kezelését.


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

Ebben a példában az API_KEY egy környezeti változóból kerül lekérésre.

Hibakezelés

Implementáljon robusztus hibakezelést a middleware függvényeiben, hogy megelőzze az alkalmazás összeomlását okozó váratlan hibákat. Használjon try...catch blokkokat a kivételek elkapására és a hibák megfelelő naplózására.


// 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(); // Vagy átirányítás egy hibaoldalra
 }
}

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

Bevált gyakorlatok

Gyakori problémák elhárítása

Összegzés

A Next.js middleware egy hatékony eszköz dinamikus és személyre szabott webalkalmazások készítéséhez. A kérések elfogásának elsajátításával széles körű funkciókat valósíthat meg, a hitelesítéstől és jogosultságkezeléstől kezdve az átirányításon át az A/B tesztelésig. Az ebben az útmutatóban vázolt bevált gyakorlatok követésével a Next.js middleware segítségével nagy teljesítményű, biztonságos és skálázható alkalmazásokat hozhat létre, amelyek megfelelnek a globális felhasználói bázis igényeinek. Használja ki a middleware erejét, hogy új lehetőségeket tárjon fel Next.js projektjeiben, és kivételes felhasználói élményt nyújtson.