Naučite se, kako uporabiti API poti v Next.js za gradnjo strežniških zaledij neposredno v vaši Next.js aplikaciji. Priročnik pokriva vse od osnovne postavitve do naprednih tehnik za avtentikacijo, shranjevanje podatkov in več.
API poti v Next.js: Enostavna gradnja vašega zaledja
Next.js je revolucioniral razvoj sprednjega dela (front-end) s svojimi zmogljivimi funkcijami in intuitivno strukturo. Ampak ali ste vedeli, da lahko znatno poenostavi tudi razvoj zaledja (backend)? API poti v Next.js vam omogočajo ustvarjanje brezstrežniških API končnih točk neposredno v vaši Next.js aplikaciji, kar v mnogih primerih odpravi potrebo po ločenem zalednem strežniku. Ta celovit vodnik vas bo popeljal skozi postopek gradnje robustnega in prilagodljivega zaledja z uporabo API poti v Next.js.
Kaj so API poti v Next.js?
API poti so brezstrežniške funkcije, ki jih ustvarite znotraj mape /pages/api
v vašem Next.js projektu. Te funkcije obravnavajo dohodne HTTP zahteve in vračajo odgovore, tako kot tradicionalni zaledni API. Ključna razlika je v tem, da so nameščene kot brezstrežniške funkcije, kar pomeni, da vam ni treba upravljati strežnikov ali infrastrukture.
Predstavljajte si jih kot lahke zaledne funkcije na zahtevo, ki so brezhibno integrirane z vašim sprednjim delom v Next.js.
Prednosti uporabe API poti v Next.js
- Poenostavljen razvoj: Pišite kodo za sprednji in zadnji del v istem projektu, z uporabo JavaScripta ali TypeScripta. Nič več preklapljanja med različnimi projekti in tehnologijami.
- Brezstrežniška arhitektura: Izkoristite prilagodljivost, zanesljivost in stroškovno učinkovitost brezstrežniškega računalništva. Plačate samo za vire, ki jih porabite.
- Enostavna namestitev: Namestite celotno aplikacijo (sprednji in zadnji del) z enim samim ukazom z uporabo platform, kot sta Vercel ali Netlify.
- Vgrajena varnost: Next.js in brezstrežniške platforme zagotavljajo vgrajene varnostne funkcije za zaščito vaših API končnih točk.
- Izboljšana zmogljivost: API poti je mogoče namestiti bližje vašim uporabnikom, kar zmanjša zakasnitev in izboljša zmogljivost, še posebej koristno za uporabnike po vsem svetu.
- Ponovna uporaba kode: Delite kodo med sprednjim in zadnjim delom, kar zmanjša podvajanje kode in izboljša vzdržljivost.
Kako začeti z API potmi v Next.js
Ustvarimo preprosto API pot, ki vrača JSON odgovor. Najprej se prepričajte, da imate nastavljen Next.js projekt. Če ga nimate, ga ustvarite z:
npx create-next-app my-app
cd my-app
Sedaj ustvarite datoteko z imenom hello.js
znotraj mape /pages/api
:
// pages/api/hello.js
export default function handler(req, res) {
res.status(200).json({ name: 'Janez Novak' })
}
Ta koda definira preprosto API pot, ki odgovori z JSON objektom, ki vsebuje ime "Janez Novak". Za dostop do te API poti zaženite vaš Next.js razvojni strežnik:
npm run dev
Nato odprite brskalnik in pojdite na http://localhost:3000/api/hello
. Morali bi videti naslednji JSON odgovor:
{"name": "Janez Novak"}
Razumevanje obdelovalca API poti
Funkcija handler
v vaši API poti prejme dva argumenta:
req
: Instancahttp.IncomingMessage
, ki vsebuje informacije o dohodni zahtevi, kot so metoda zahteve, glave in telo.res
: Instancahttp.ServerResponse
, ki vam omogoča pošiljanje odgovora nazaj odjemalcu.
Te objekte lahko uporabite za obravnavo različnih vrst zahtev, branje podatkov iz telesa zahteve, nastavitev glav odgovora in pošiljanje različnih vrst odgovorov.
Obravnava različnih HTTP metod
Lastnost req.method
lahko uporabite za določitev HTTP metode dohodne zahteve in ustrezno obravnavo različnih metod. Na primer:
// pages/api/method.js
export default function handler(req, res) {
if (req.method === 'GET') {
// Obravnava zahteve GET
res.status(200).json({ message: 'To je GET zahteva' })
} else if (req.method === 'POST') {
// Obravnava zahteve POST
res.status(200).json({ message: 'To je POST zahteva' })
} else {
// Obravnava drugih metod
res.status(405).json({ message: 'Metoda ni dovoljena' })
}
}
V tem primeru API pot obravnava tako zahteve GET kot POST. Če je metoda zahteve GET, odgovori z JSON objektom, ki vsebuje sporočilo "To je GET zahteva". Če je metoda zahteve POST, odgovori z JSON objektom, ki vsebuje sporočilo "To je POST zahteva". Če je metoda zahteve karkoli drugega, odgovori z napako 405 Metoda ni dovoljena.
Branje podatkov iz telesa zahteve
Za zahteve POST, PUT in PATCH pogosto potrebujete branje podatkov iz telesa zahteve. Next.js ponuja vgrajeno podporo za razčlenjevanje JSON in URL-kodiranih teles zahtev. Za razčlenjevanje JSON telesa zahteve lahko uporabite lastnost req.body
. Na primer:
// pages/api/post.js
export default async function handler(req, res) {
if (req.method === 'POST') {
const { name, email } = req.body
// Obdelaj podatke
console.log('Ime:', name)
console.log('E-pošta:', email)
res.status(200).json({ message: 'Podatki uspešno prejeti' })
} else {
res.status(405).json({ message: 'Metoda ni dovoljena' })
}
}
Za testiranje te API poti lahko uporabite orodje, kot je Postman ali curl, za pošiljanje zahteve POST z JSON telesom:
curl -X POST -H "Content-Type: application/json" -d '{"name": "Jana Novak", "email": "jana.novak@example.com"}' http://localhost:3000/api/post
Nastavitev glav odgovora
Metodo res.setHeader()
lahko uporabite za nastavitev glav odgovora. To je uporabno za nastavitev vrste vsebine, nadzora predpomnjenja in drugih pomembnih informacij. Na primer:
// 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: 'Pozdravljen, svet!' })
}
V tem primeru API pot nastavi glavo Content-Type
na application/json
, kar pomeni, da je odgovor JSON objekt. Prav tako nastavi glavo Cache-Control
na s-maxage=3600
, kar brskalniku in CDN-ju pove, naj odgovor predpomni za do 1 uro.
Obravnavanje napak
Pomembno je, da napake v svojih API poteh obravnavate elegantno. Uporabite lahko bloke try-catch za lovljenje izjem in pošiljanje ustreznih odgovorov o napakah odjemalcu. Na primer:
// pages/api/error.js
export default async function handler(req, res) {
try {
// Simuliraj napako
throw new Error('Nekaj je šlo narobe')
} catch (error) {
console.error(error)
res.status(500).json({ message: 'Notranja napaka strežnika' })
}
}
V tem primeru API pot simulira napako tako, da vrže nov objekt Error
. Blok catch ujame napako, jo zapiše v konzolo in odjemalcu pošlje odgovor 500 Notranja napaka strežnika. Za produkcijska okolja razmislite o uporabi robustnega sistema za beleženje, kot sta Sentry ali Datadog.
Povezovanje s podatkovno bazo
Eden najpogostejših primerov uporabe API poti je povezovanje s podatkovno bazo. API poti v Next.js se brezhibno integrirajo z različnimi podatkovnimi bazami, vključno z:
- MongoDB: Priljubljena NoSQL podatkovna baza, ki je primerna za fleksibilne in nestrukturirane podatke.
- PostgreSQL: Zmogljiva in odprtokodna relacijska podatkovna baza, znana po svoji zanesljivosti in integriteti podatkov.
- MySQL: Še ena priljubljena odprtokodna relacijska podatkovna baza, ki se pogosto uporablja za spletne aplikacije.
- Firebase: Platforma v oblaku, ki ponuja realno-časovno podatkovno bazo in druge storitve.
- FaunaDB: Brezstrežniška podatkovna baza, zasnovana za globalne aplikacije.
Tukaj je primer, kako se povezati s podatkovno bazo MongoDB v API poti Next.js:
// 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('Prosimo, dodajte svoj Mongo URI v .env.local')
}
if (process.env.NODE_ENV === 'development') {
// V razvojnem načinu uporabite globalno spremenljivko, da se vrednost
// ohrani med ponovnimi nalaganji modulov, ki jih povzroči HMR (Hot Module Replacement).
if (!global._mongoClientPromise) {
client = new MongoClient(uri, options)
global._mongoClientPromise = client.connect()
}
clientPromise = global._mongoClientPromise
} else {
// V produkcijskem načinu je bolje ne uporabljati globalne spremenljivke.
client = new MongoClient(uri, options)
clientPromise = client.connect()
}
// Izvozite obljubo MongoClient, ki je omejena na modul. S tem v
// ločenem modulu lahko odjemalca varno ponovno uporabite v več
// funkcijah. Glejte: 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: 'Pridobivanje uporabnikov ni uspelo' })
}
}
Preden zaženete to kodo, se prepričajte, da imate nameščen paket mongodb
:
npm install mongodb
Prav tako morate nastaviti okoljski spremenljivki MONGODB_URI
in MONGODB_DB
. Ti spremenljivki naj bosta definirani v vaši datoteki .env.local
(ali v nastavitvah okoljskih spremenljivk vašega ponudnika gostovanja za produkcijo). MONGODB_URI
vsebuje povezovalni niz do vaše podatkovne baze MongoDB, MONGODB_DB
pa določa ime podatkovne baze.
Avtentikacija in avtorizacija
Zaščita vaših API poti je ključnega pomena za varnost. API poti v Next.js je mogoče zavarovati z različnimi tehnikami avtentikacije in avtorizacije, vključno z:
- JSON spletni žetoni (JWT): Standard za varen prenos informacij med strankama kot JSON objekt.
- API ključi: Preprost način za omejitev dostopa do vaših API končnih točk.
- OAuth: Delegacijski protokol, ki uporabnikom omogoča, da tretjim aplikacijam odobrijo dostop do svojih virov brez deljenja poverilnic.
- NextAuth.js: Celovita odprtokodna rešitev za avtentikacijo za aplikacije Next.js.
Tukaj je primer, kako zaščititi API pot z uporabo avtentikacije JWT:
// 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: 'Neavtorizirano' })
}
try {
const decoded = jwt.verify(token, secret)
// Objekt "decoded" vsebuje informacije o uporabniku, vdelane v žeton
// Na primer: const userId = decoded.userId;
// Nadaljuj z obdelavo zahteve
res.status(200).json({ message: 'Zaščiten vir uspešno dostopen' })
} catch (error) {
return res.status(401).json({ message: 'Neveljaven žeton' })
}
}
Preden zaženete to kodo, se prepričajte, da imate nameščen paket jsonwebtoken
:
npm install jsonwebtoken
Prav tako morate nastaviti okoljsko spremenljivko JWT_SECRET
. To mora biti močan, naključno generiran skrivni ključ, ki se uporablja za podpisovanje in preverjanje JWT-jev. Shranite ga varno in ga nikoli ne izpostavljajte v kodi na strani odjemalca.
Vmesna programska oprema (Middleware)
Čeprav Next.js ne ponuja tradicionalne vmesne programske opreme za API poti na enak način kot Express.js, lahko podobno funkcionalnost dosežete z ovijanjem obdelovalcev API poti v ponovno uporabne funkcije. To vam omogoča izvajanje nalog, kot so:
- Avtentikacija: Preverite poverilnice uporabnika pred dovoljenjem dostopa do API končnih točk.
- Avtorizacija: Preverite, ali ima uporabnik potrebna dovoljenja za izvedbo določenega dejanja.
- Beleženje: Beležite dohodne zahteve in odhodne odgovore za namene revizije in odpravljanja napak.
- Validacija: Validirajte podatke zahteve, da zagotovite, da ustrezajo določenim merilom.
- Omejevanje hitrosti: Zaščitite svoj API pred zlorabo z omejevanjem števila zahtev, ki jih uporabnik lahko naredi v določenem časovnem obdobju.
Tukaj je primer, kako ustvariti preprosto vmesno programsko opremo za beleženje:
// 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)
}
}
Za uporabo te vmesne programske opreme preprosto ovijte obdelovalec vaše API poti s funkcijo withLogging
:
// pages/api/logged.js
import { withLogging } from '../../utils/middleware'
async function handler(req, res) {
res.status(200).json({ message: 'Ta zahteva je bila zabeležena' })
}
export default withLogging(handler)
Najboljše prakse za gradnjo API poti v Next.js
- Ohranite svoje API poti majhne in osredotočene. Vsaka API pot naj bi obravnavala določeno nalogo ali vir.
- Uporabljajte okoljske spremenljivke za občutljive podatke. Nikoli ne vpisujte skrivnosti ali API ključev neposredno v kodo.
- Validirajte podatke zahteve, da preprečite varnostne ranljivosti. Uporabite knjižnico, kot je Joi ali Yup, za validacijo teles zahtev.
- Elegantno obravnavajte napake in zagotovite informativna sporočila o napakah. Uporabljajte bloke try-catch in beležite napake na osrednjo lokacijo.
- Uporabljajte predpomnjenje za izboljšanje zmogljivosti. Predpomnite pogosto dostopane podatke, da zmanjšate obremenitev podatkovne baze.
- Spremljajte svoje API poti glede zmogljivosti in napak. Uporabite orodje za spremljanje, kot sta Sentry ali Datadog, za sledenje stanju vašega API-ja.
- Dokumentirajte svoje API poti z orodjem, kot je Swagger ali OpenAPI. To drugim razvijalcem olajša uporabo vašega API-ja.
- Razmislite o uporabi TypeScripta za varnost tipov. TypeScript vam lahko pomaga zgodaj odkriti napake in izboljšati vzdržljivost vaše kode.
- Že od začetka razmišljajte o internacionalizaciji (i18n). Če bodo vašo aplikacijo uporabljali uporabniki iz različnih držav, oblikujte svoje API poti tako, da podpirajo več jezikov in valut. Na primer, API končne točke za e-trgovino bodo morda morale obravnavati različne davčne stopnje in stroške pošiljanja glede na lokacijo uporabnika.
- Implementirajte pravilno konfiguracijo CORS (Cross-Origin Resource Sharing). To je ključnega pomena, kadar se do vašega API-ja dostopa iz druge domene kot vaša aplikacija Next.js. Previdno konfigurirajte CORS, da dovolite dostop do vaših API virov samo pooblaščenim izvorom.
Napredne tehnike
Ozadna opravila
Za dolgotrajna opravila, ki ne smejo blokirati odgovora API-ja, razmislite o uporabi ozadnih opravil. Za upravljanje ozadnih opravil in njihovo asinhrono obdelavo lahko uporabite knjižnice, kot sta BullMQ ali Bree.
WebSockets
Za aplikacije v realnem času lahko v svojih API poteh Next.js uporabite WebSockets. Knjižnice, kot sta Socket.IO in ws, olajšajo vzpostavitev trajnih povezav med odjemalcem in strežnikom.
GraphQL
Če potrebujete bolj prilagodljiv in učinkovit način za pridobivanje podatkov, razmislite o uporabi GraphQL. Za ustvarjanje GraphQL API končne točke v vaši aplikaciji Next.js lahko uporabite knjižnice, kot sta Apollo Server ali Yoga.
Zaključek
API poti v Next.js zagotavljajo zmogljiv in priročen način za gradnjo brezstrežniških zaledij neposredno v vaši aplikaciji Next.js. Z izkoriščanjem prednosti brezstrežniške arhitekture lahko poenostavite razvoj, izboljšate zmogljivost in zmanjšate stroške. Ne glede na to, ali gradite preprost kontaktni obrazec ali zapleteno e-trgovinsko platformo, vam lahko API poti v Next.js pomagajo z lahkoto ustvariti robustno in prilagodljivo zaledje. S trdnim razumevanjem osnov in uporabo najboljših praks lahko to zmogljivo orodje izkoristite za ustvarjanje učinkovitih, varnih in globalno dostopnih aplikacij.