Naučte sa, ako využiť Next.js API Routes na vytváranie serverless backendov priamo vo vašej Next.js aplikácii. Táto príručka pokrýva všetko od základného nastavenia až po pokročilé techniky.
Next.js API Routes: Tvorba backendu s ľahkosťou
Next.js priniesol revolúciu do front-end vývoja vďaka svojim výkonným funkciám a intuitívnej štruktúre. Vedeli ste však, že dokáže výrazne zjednodušiť aj vývoj backendu? Next.js API Routes vám umožňujú vytvárať serverless API koncové body priamo vo vašej Next.js aplikácii, čím v mnohých prípadoch eliminujú potrebu samostatného backendového servera. Táto komplexná príručka vás prevedie procesom budovania robustného a škálovateľného backendu pomocou Next.js API Routes.
Čo sú Next.js API Routes?
API Routes sú serverless funkcie, ktoré vytvárate v adresári /pages/api
vo vašom Next.js projekte. Tieto funkcie spracovávajú prichádzajúce HTTP požiadavky a vracajú odpovede, rovnako ako tradičné backendové API. Kľúčový rozdiel je v tom, že sú nasadené ako serverless funkcie, čo znamená, že nemusíte spravovať servery ani infraštruktúru.
Predstavte si ich ako odľahčené backendové funkcie na požiadanie, ktoré sú bezproblémovo integrované s vaším Next.js front-endom.
Výhody používania Next.js API Routes
- Zjednodušený vývoj: Píšte kód pre front-end aj backend v tom istom projekte s použitím JavaScriptu alebo TypeScriptu. Už žiadne prepínanie kontextu medzi rôznymi projektmi a technológiami.
- Serverless architektúra: Profitujte ze škálovateľnosti, spoľahlivosti a nákladovej efektívnosti serverless computingu. Platíte len za zdroje, ktoré spotrebujete.
- Jednoduché nasadenie: Nasaďte celú svoju aplikáciu (front-end aj backend) jediným príkazom pomocou platforiem ako Vercel alebo Netlify.
- Vstavaná bezpečnosť: Next.js a serverless platformy poskytujú vstavané bezpečnostné funkcie na ochranu vašich API koncových bodov.
- Zlepšený výkon: API Routes môžu byť nasadené bližšie k vašim používateľom, čím sa znižuje latencia a zlepšuje výkon, čo je obzvlášť prínosné pre používateľov na celom svete.
- Znovupoužiteľnosť kódu: Zdieľajte kód medzi vaším front-endom a backendom, čím znížite duplicitu kódu a zlepšíte udržiavateľnosť.
Začíname s Next.js API Routes
Vytvorme si jednoduchú API route, ktorá vráti JSON odpoveď. Najprv sa uistite, že máte nastavený Next.js projekt. Ak nie, vytvorte ho pomocou:
npx create-next-app my-app
cd my-app
Teraz vytvorte súbor s názvom hello.js
v adresári /pages/api
:
// pages/api/hello.js
export default function handler(req, res) {
res.status(200).json({ name: 'John Doe' })
}
Tento kód definuje jednoduchú API route, ktorá odpovedá JSON objektom obsahujúcim meno "John Doe". Pre prístup k tejto API route spustite váš vývojový server Next.js:
npm run dev
Potom otvorte prehliadač a prejdite na http://localhost:3000/api/hello
. Mali by ste vidieť nasledujúcu JSON odpoveď:
{"name": "John Doe"}
Pochopenie handlera API Route
Funkcia handler
vo vašej API route prijíma dva argumenty:
req
: Inštanciahttp.IncomingMessage
, ktorá obsahuje informácie o prichádzajúcej požiadavke, ako sú metóda požiadavky, hlavičky a telo.res
: Inštanciahttp.ServerResponse
, ktorá vám umožňuje poslať odpoveď späť klientovi.
Tieto objekty môžete použiť na spracovanie rôznych typov požiadaviek, čítanie dát z tela požiadavky, nastavenie hlavičiek odpovede a odosielanie rôznych typov odpovedí.
Spracovanie rôznych HTTP metód
Môžete použiť vlastnosť req.method
na určenie HTTP metódy prichádzajúcej požiadavky a podľa toho spracovať rôzne metódy. Napríklad:
// pages/api/method.js
export default function handler(req, res) {
if (req.method === 'GET') {
// Spracovanie GET požiadavky
res.status(200).json({ message: 'Toto je GET požiadavka' })
} else if (req.method === 'POST') {
// Spracovanie POST požiadavky
res.status(200).json({ message: 'Toto je POST požiadavka' })
} else {
// Spracovanie ostatných metód
res.status(405).json({ message: 'Metóda nie je povolená' })
}
}
V tomto príklade API route spracováva GET aj POST požiadavky. Ak je metóda požiadavky GET, odpovie JSON objektom so správou "Toto je GET požiadavka". Ak je metóda požiadavky POST, odpovie JSON objektom so správou "Toto je POST požiadavka". Ak je metóda požiadavky akákoľvek iná, odpovie chybou 405 Metóda nie je povolená.
Čítanie dát z tela požiadavky
Pre požiadavky typu POST, PUT a PATCH často potrebujete čítať dáta z tela požiadavky. Next.js poskytuje vstavanú podporu pre parsovanie JSON a URL-enkódovaných tiel požiadaviek. Na parsovanie JSON tela požiadavky môžete použiť vlastnosť req.body
. Napríklad:
// pages/api/post.js
export default async function handler(req, res) {
if (req.method === 'POST') {
const { name, email } = req.body
// Spracovanie dát
console.log('Name:', name)
console.log('Email:', email)
res.status(200).json({ message: 'Dáta úspešne prijaté' })
} else {
res.status(405).json({ message: 'Metóda nie je povolená' })
}
}
Na otestovanie tejto API route môžete použiť nástroj ako Postman alebo curl na odoslanie POST požiadavky s JSON telom:
curl -X POST -H "Content-Type: application/json" -d '{"name": "Jane Doe", "email": "jane.doe@example.com"}' http://localhost:3000/api/post
Nastavenie hlavičiek odpovede
Na nastavenie hlavičiek odpovede môžete použiť metódu res.setHeader()
. To je užitočné na nastavenie typu obsahu, cache control a ďalších dôležitých informácií. Napríklad:
// pages/api/headers.js
export default function handler(req, res) {
res.setHeader('Content-Type', 'application/json')
res.setHeader('Cache-Control', 's-maxage=3600')
res.status(200).json({ message: 'Ahoj, svet!' })
}
V tomto príklade API route nastavuje hlavičku Content-Type
na application/json
, čo naznačuje, že odpoveď je JSON objekt. Taktiež nastavuje hlavičku Cache-Control
na s-maxage=3600
, čo hovorí prehliadaču a CDN, aby odpoveď cachovali až na 1 hodinu.
Spracovanie chýb
Je dôležité správne spracovávať chyby vo vašich API routes. Môžete použiť bloky try-catch na zachytenie výnimiek a odoslanie príslušných chybových odpovedí klientovi. Napríklad:
// pages/api/error.js
export default async function handler(req, res) {
try {
// Simulácia chyby
throw new Error('Niečo sa pokazilo')
} catch (error) {
console.error(error)
res.status(500).json({ message: 'Vnútorná chyba servera' })
}
}
V tomto príklade API route simuluje chybu vyhodením nového objektu Error
. Blok catch chybu zachytí, zapíše ju do konzoly a odošle klientovi odpoveď 500 Vnútorná chyba servera. Pre produkčné prostredia zvážte použitie robustného systému na logovanie, ako je Sentry alebo Datadog.
Pripojenie k databáze
Jedným z najbežnejších prípadov použitia API routes je pripojenie k databáze. Next.js API Routes sa bezproblémovo integrujú s rôznymi databázami, vrátane:
- MongoDB: Populárna NoSQL databáza, ktorá je vhodná pre flexibilné a neštruktúrované dáta.
- PostgreSQL: Výkonná open-source relačná databáza, známa svojou spoľahlivosťou a integritou dát.
- MySQL: Ďalšia populárna open-source relačná databáza, široko používaná pre webové aplikácie.
- Firebase: Cloudová platforma, ktorá poskytuje real-time databázu a ďalšie služby.
- FaunaDB: Serverless databáza navrhnutá pre globálne aplikácie.
Tu je príklad, ako sa pripojiť k databáze MongoDB v Next.js API route:
// pages/api/mongodb.js
import { MongoClient } from 'mongodb'
const uri = process.env.MONGODB_URI
const options = {}
let client
let clientPromise
if (!process.env.MONGODB_URI) {
throw new Error('Prosím, pridajte vašu Mongo URI do .env.local')
}
if (process.env.NODE_ENV === 'development') {
// Vo vývojovom režime použite globálnu premennú, aby sa hodnota
// zachovala pri opätovnom načítaní modulu spôsobenom HMR (Hot Module Replacement).
if (!global._mongoClientPromise) {
client = new MongoClient(uri, options)
global._mongoClientPromise = client.connect()
}
clientPromise = global._mongoClientPromise
} else {
// V produkčnom režime je lepšie nepoužívať globálnu premennú.
client = new MongoClient(uri, options)
clientPromise = client.connect()
}
// Exportujte MongoClient promise s platnosťou v rámci modulu. Týmto spôsobom v
// samostatnom module môže byť klient bezpečne opätovne použitý vo viacerých
// funkciách. Viď: https://github.com/vercel/next.js/blob/canary/examples/with-mongodb/lib/mongodb.js
export default async function handler(req, res) {
try {
const client = await clientPromise
const db = client.db(process.env.MONGODB_DB)
const collection = db.collection('users')
const users = await collection.find({}).toArray()
res.status(200).json({ users })
} catch (e) {
console.error(e)
res.status(500).json({ message: 'Nepodarilo sa načítať používateľov' })
}
}
Pred spustením tohto kódu sa uistite, že máte nainštalovaný balíček mongodb
:
npm install mongodb
Taktiež musíte nastaviť premenné prostredia MONGODB_URI
a MONGODB_DB
. Tieto premenné by mali byť definované vo vašom súbore .env.local
(alebo v nastaveniach premenných prostredia vášho hostingového poskytovateľa pre produkciu). MONGODB_URI
obsahuje pripojovací reťazec k vašej databáze MongoDB a MONGODB_DB
špecifikuje názov databázy.
Autentifikácia a autorizácia
Ochrana vašich API routes je kľúčová pre bezpečnosť. Next.js API Routes je možné zabezpečiť pomocou rôznych autentifikačných a autorizačných techník, vrátane:
- JSON Web Tokens (JWT): Štandard pre bezpečný prenos informácií medzi stranami ako JSON objekt.
- API kľúče: Jednoduchý spôsob, ako obmedziť prístup k vašim API koncovým bodom.
- OAuth: Delegačný protokol, ktorý umožňuje používateľom udeliť prístup tretím stranám k ich zdrojom bez zdieľania svojich prihlasovacích údajov.
- NextAuth.js: Kompletné open-source riešenie pre autentifikáciu v Next.js aplikáciách.
Tu je príklad, ako ochrániť API route pomocou JWT autentifikácie:
// pages/api/protected.js
import jwt from 'jsonwebtoken'
const secret = process.env.JWT_SECRET
export default function handler(req, res) {
const token = req.headers.authorization?.split(' ')[1]
if (!token) {
return res.status(401).json({ message: 'Neautorizovaný prístup' })
}
try {
const decoded = jwt.verify(token, secret)
// Objekt "decoded" obsahuje informácie o používateľovi vložené v tokene
// Napríklad: const userId = decoded.userId;
// Pokračovať v spracovaní požiadavky
res.status(200).json({ message: 'Prístup k chránenému zdroju bol úspešný' })
} catch (error) {
return res.status(401).json({ message: 'Neplatný token' })
}
}
Pred spustením tohto kódu sa uistite, že máte nainštalovaný balíček jsonwebtoken
:
npm install jsonwebtoken
Taktiež musíte nastaviť premennú prostredia JWT_SECRET
. Mal by to byť silný, náhodne vygenerovaný tajný kľúč, ktorý sa používa na podpisovanie a overovanie JWT. Uložte ho bezpečne a nikdy ho neodhaľujte vo svojom kóde na strane klienta.
Middleware
Hoci Next.js neponúka tradičný middleware pre API routes spôsobom, akým to robí Express.js, môžete dosiahnuť podobnú funkcionalitu obalením vašich handlerov API route do znovupoužiteľných funkcií. To vám umožní vykonávať úlohy ako:
- Autentifikácia: Overenie prihlasovacích údajov používateľa pred povolením prístupu k API koncovým bodom.
- Autorizácia: Kontrola, či má používateľ potrebné oprávnenia na vykonanie konkrétnej akcie.
- Logovanie: Zaznamenávanie prichádzajúcich požiadaviek a odchádzajúcich odpovedí na účely auditu a ladenia.
- Validácia: Validácia dát požiadavky, aby sa zabezpečilo, že spĺňajú špecifické kritériá.
- Obmedzenie frekvencie (Rate Limiting): Ochrana vášho API pred zneužitím obmedzením počtu požiadaviek, ktoré môže používateľ uskutočniť v danom časovom období.
Tu je príklad, ako vytvoriť jednoduchý middleware na logovanie:
// utils/middleware.js
export function withLogging(handler) {
return async function(req, res) {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`)
return handler(req, res)
}
}
Na použitie tohto middleware jednoducho obaľte váš handler API route funkciou withLogging
:
// pages/api/logged.js
import { withLogging } from '../../utils/middleware'
async function handler(req, res) {
res.status(200).json({ message: 'Táto požiadavka bola zalogovaná' })
}
export default withLogging(handler)
Osvedčené postupy pre tvorbu Next.js API Routes
- Udržujte vaše API routes malé a zamerané. Každá API route by mala spracovávať špecifickú úlohu alebo zdroj.
- Používajte premenné prostredia pre citlivé dáta. Nikdy nekódujte natvrdo tajomstvá alebo API kľúče vo vašom kóde.
- Validujte dáta požiadavky, aby ste predišli bezpečnostným zraniteľnostiam. Použite knižnicu ako Joi alebo Yup na validáciu tiel požiadaviek.
- Spracovávajte chyby elegantne a poskytujte informatívne chybové správy. Používajte bloky try-catch a logujte chyby na centrálne miesto.
- Používajte cachovanie na zlepšenie výkonu. Cachujte často pristupované dáta, aby ste znížili zaťaženie databázy.
- Monitorujte svoje API routes z hľadiska výkonu a chýb. Použite monitorovací nástroj ako Sentry alebo Datadog na sledovanie stavu vášho API.
- Dokumentujte svoje API routes pomocou nástroja ako Swagger alebo OpenAPI. Uľahčí to ostatným vývojárom používanie vášho API.
- Zvážte použitie TypeScriptu pre typovú bezpečnosť. TypeScript vám môže pomôcť odhaliť chyby včas a zlepšiť udržiavateľnosť vášho kódu.
- Myslite na internacionalizáciu (i18n) od samého začiatku. Ak bude vaša aplikácia používaná používateľmi z rôznych krajín, navrhnite svoje API routes tak, aby podporovali viacero jazykov a mien. Napríklad API koncové body pre e-commerce možno budú musieť spracovávať rôzne daňové sadzby a náklady na dopravu na základe polohy používateľa.
- Implementujte správnu konfiguráciu CORS (Cross-Origin Resource Sharing). Je to kľúčové, keď je vaše API pristupované z inej domény ako vaša Next.js aplikácia. Dôkladne nakonfigurujte CORS, aby ste povolili prístup k vašim API zdrojom iba autorizovaným pôvodom.
Pokročilé techniky
Úlohy na pozadí
Pre dlhotrvajúce úlohy, ktoré by nemali blokovať odpoveď API, zvážte použitie úloh na pozadí. Na správu úloh na pozadí a ich asynchrónne spracovanie môžete použiť knižnice ako BullMQ alebo Bree.
WebSockets
Pre real-time aplikácie môžete použiť WebSockets vo vašich Next.js API routes. Knižnice ako Socket.IO a ws uľahčujú nadviazanie trvalých spojení medzi klientom a serverom.
GraphQL
Ak potrebujete flexibilnejší a efektívnejší spôsob načítavania dát, zvážte použitie GraphQL. Na vytvorenie GraphQL API koncového bodu vo vašej Next.js aplikácii môžete použiť knižnice ako Apollo Server alebo Yoga.
Záver
Next.js API Routes poskytujú výkonný a pohodlný spôsob, ako budovať serverless backendy priamo vo vašej Next.js aplikácii. Využitím výhod serverless architektúry môžete zjednodušiť vývoj, zlepšiť výkon a znížiť náklady. Či už vytvárate jednoduchý kontaktný formulár alebo komplexnú e-commerce platformu, Next.js API Routes vám môžu pomôcť ľahko vytvoriť robustný a škálovateľný backend. S pevným pochopením základov a uplatňovaním osvedčených postupov môžete tento výkonný nástroj využiť na vytváranie efektívnych, bezpečných a globálne dostupných aplikácií.