Õppige, kuidas Next.js API marsruutide abil ehitada serverivabu taustasüsteeme otse oma Next.js rakenduses. Juhend katab kõik alates põhisätetest kuni täiustatud tehnikateni.
Next.js API marsruudid: taustasüsteemi lihtne ehitamine
Next.js on revolutsioneerinud esirakenduste arendust oma võimsate funktsioonide ja intuitiivse struktuuriga. Aga kas teadsite, et see võib oluliselt lihtsustada ka taustasüsteemi arendust? Next.js API marsruudid võimaldavad teil luua serverivabu API lõpp-punkte otse oma Next.js rakenduses, kaotades paljudel juhtudel vajaduse eraldi taustaserveri järele. See põhjalik juhend juhatab teid läbi protsessi, kuidas ehitada robustset ja skaleeruvat taustasüsteemi kasutades Next.js API marsruute.
Mis on Next.js API marsruudid?
API marsruudid on serverivabad funktsioonid, mille loote oma /pages/api
kausta oma Next.js projektis. Need funktsioonid käsitlevad sissetulevaid HTTP päringuid ja tagastavad vastuseid, täpselt nagu traditsiooniline taustasüsteemi API. Peamine erinevus seisneb selles, et need on paigaldatud serverivabade funktsioonidena, mis tähendab, et te ei pea haldama servereid ega infrastruktuuri.
Mõelge neist kui kergetest, nõudmisel põhinevatest taustasüsteemi funktsioonidest, mis on sujuvalt integreeritud teie Next.js esirakendusega.
Next.js API marsruutide kasutamise eelised
- Lihtsustatud arendus: Kirjutage nii oma esirakenduse kui ka taustasüsteemi kood samas projektis, kasutades JavaScripti või TypeScripti. Ei mingit konteksti vahetamist erinevate projektide ja tehnoloogiate vahel.
- Serverivaba arhitektuur: Kasutage serverivaba arvutustehnoloogia skaleeruvust, usaldusväärsust ja kulutõhusust. Makske ainult tarbitud ressursside eest.
- Lihtne paigaldus: Paigaldage kogu oma rakendus (esirakendus ja taustasüsteem) ühe käsuga, kasutades platvorme nagu Vercel või Netlify.
- Sisse-ehitatud turvalisus: Next.js ja serverivabad platvormid pakuvad sisseehitatud turvafunktsioone teie API lõpp-punktide kaitsmiseks.
- Parem jõudlus: API marsruute saab paigaldada kasutajatele lähemale, vähendades latentsust ja parandades jõudlust, mis on eriti kasulik globaalsetele kasutajatele.
- Koodi taaskasutatavus: Jagage koodi oma esirakenduse ja taustasüsteemi vahel, vähendades koodi dubleerimist ja parandades hooldatavust.
Alustamine Next.js API marsruutidega
Loome lihtsa API marsruudi, mis tagastab JSON-vastuse. Esmalt veenduge, et teil on Next.js projekt seadistatud. Kui ei, looge see kasutades:
npx create-next-app my-app
cd my-app
Nüüd looge fail nimega hello.js
kausta /pages/api
:
// pages/api/hello.js
export default function handler(req, res) {
res.status(200).json({ name: 'John Doe' })
}
See kood defineerib lihtsa API marsruudi, mis vastab JSON-objektiga, mis sisaldab nime "John Doe". Selle API marsruudi kasutamiseks käivitage oma Next.js arendusserver:
npm run dev
Seejärel avage oma brauser ja navigeerige aadressile http://localhost:3000/api/hello
. Peaksite nägema järgmist JSON-vastust:
{"name": "John Doe"}
API marsruudi käsitleja mõistmine
handler
-funktsioon teie API marsruudis saab kaks argumenti:
req
:http.IncomingMessage
'i eksemplar, mis sisaldab teavet sissetuleva päringu kohta, nagu päringu meetod, päised ja keha.res
:http.ServerResponse
'i eksemplar, mis võimaldab teil saata vastuse tagasi kliendile.
Saate neid objekte kasutada erinevat tüüpi päringute käsitlemiseks, andmete lugemiseks päringu kehast, vastuse päiste määramiseks ja erinevat tüüpi vastuste saatmiseks.
Erinevate HTTP meetodite käsitlemine
Saate kasutada req.method
omadust, et määrata sissetuleva päringu HTTP meetod ja käsitleda erinevaid meetodeid vastavalt. Näiteks:
// pages/api/method.js
export default function handler(req, res) {
if (req.method === 'GET') {
// Käsitle GET päringut
res.status(200).json({ message: 'This is a GET request' })
} else if (req.method === 'POST') {
// Käsitle POST päringut
res.status(200).json({ message: 'This is a POST request' })
} else {
// Käsitle teisi meetodeid
res.status(405).json({ message: 'Method Not Allowed' })
}
}
Selles näites käsitleb API marsruut nii GET kui ka POST päringuid. Kui päringu meetod on GET, vastab see JSON-objektiga, mis sisaldab teadet "This is a GET request". Kui päringu meetod on POST, vastab see JSON-objektiga, mis sisaldab teadet "This is a POST request". Kui päringu meetod on midagi muud, vastab see 405 Method Not Allowed veaga.
Andmete lugemine päringu kehast
POST, PUT ja PATCH päringute puhul peate sageli lugema andmeid päringu kehast. Next.js pakub sisseehitatud tuge JSON- ja URL-kodeeritud päringukehade parsimiseks. JSON-päringu keha parsimiseks saate kasutada req.body
omadust. Näiteks:
// pages/api/post.js
export default async function handler(req, res) {
if (req.method === 'POST') {
const { name, email } = req.body
// Töötle andmeid
console.log('Name:', name)
console.log('Email:', email)
res.status(200).json({ message: 'Data received successfully' })
} else {
res.status(405).json({ message: 'Method Not Allowed' })
}
}
Selle API marsruudi testimiseks saate kasutada tööriista nagu Postman või curl, et saata POST-päring JSON-kehaga:
curl -X POST -H "Content-Type: application/json" -d '{"name": "Jane Doe", "email": "jane.doe@example.com"}' http://localhost:3000/api/post
Vastuse päiste määramine
Saate kasutada res.setHeader()
meetodit vastuse päiste määramiseks. See on kasulik sisu tüübi, vahemälu kontrolli ja muu olulise teabe seadistamiseks. Näiteks:
// 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: 'Hello, world!' })
}
Selles näites määrab API marsruut Content-Type
päise väärtuseks application/json
, mis näitab, et vastus on JSON-objekt. Samuti seab see Cache-Control
päise väärtuseks s-maxage=3600
, mis käsib brauseril ja CDN-il vastust vahemällu salvestada kuni 1 tunniks.
Vigade käsitlemine
On oluline oma API marsruutides vigu sujuvalt käsitleda. Saate kasutada try-catch plokke erandite püüdmiseks ja kliendile asjakohaste veateadete saatmiseks. Näiteks:
// pages/api/error.js
export default async function handler(req, res) {
try {
// Simuleeri viga
throw new Error('Something went wrong')
} catch (error) {
console.error(error)
res.status(500).json({ message: 'Internal Server Error' })
}
}
Selles näites simuleerib API marsruut viga, visates uue Error
objekti. Catch-plokk püüab vea kinni, logib selle konsooli ja saadab kliendile 500 Internal Server Error vastuse. Kaaluge tootmiskeskkondades robustse logimissüsteemi, nagu Sentry või Datadog, kasutamist.
Andmebaasiga ühendumine
Üks levinumaid kasutusjuhtumeid API marsruutide jaoks on andmebaasiga ühendumine. Next.js API marsruudid integreeruvad sujuvalt erinevate andmebaasidega, sealhulgas:
- MongoDB: Populaarne NoSQL-andmebaas, mis sobib hästi paindlike ja struktureerimata andmete jaoks.
- PostgreSQL: Võimas ja avatud lähtekoodiga relatsiooniline andmebaas, mis on tuntud oma usaldusväärsuse ja andmete terviklikkuse poolest.
- MySQL: Teine populaarne avatud lähtekoodiga relatsiooniline andmebaas, mida kasutatakse laialdaselt veebirakendustes.
- Firebase: Pilvepõhine platvorm, mis pakub reaalajas andmebaasi ja muid teenuseid.
- FaunaDB: Serverivaba andmebaas, mis on loodud globaalsete rakenduste jaoks.
Siin on näide, kuidas ühenduda MongoDB andmebaasiga Next.js API marsruudis:
// 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('Please add your Mongo URI to .env.local')
}
if (process.env.NODE_ENV === 'development') {
// Arendusrežiimis kasutage globaalset muutujat, et väärtus
// säiliks moodulite taaslaadimisel, mille on põhjustanud HMR (Hot Module Replacement).
if (!global._mongoClientPromise) {
client = new MongoClient(uri, options)
global._mongoClientPromise = client.connect()
}
clientPromise = global._mongoClientPromise
} else {
// Tootmisrežiimis on parem mitte kasutada globaalset muutujat.
client = new MongoClient(uri, options)
clientPromise = client.connect()
}
// Eksportige mooduli ulatusega MongoClient'i lubadus. Tehes seda
// eraldi moodulis, saab klienti ohutult taaskasutada mitme
// funktsiooni vahel. Vaata: 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: 'Failed to fetch users' })
}
}
Enne selle koodi käivitamist veenduge, et teil on mongodb
pakett installitud:
npm install mongodb
Samuti peate määrama keskkonnamuutujad MONGODB_URI
ja MONGODB_DB
. Need muutujad tuleks defineerida teie .env.local
failis (või teie hostingu pakkuja keskkonnamuutujate seadetes tootmises). MONGODB_URI
sisaldab ühenduse stringi teie MongoDB andmebaasiga ja MONGODB_DB
määrab andmebaasi nime.
Autentimine ja autoriseerimine
Oma API marsruutide kaitsmine on turvalisuse seisukohalt ülioluline. Next.js API marsruute saab turvata, kasutades erinevaid autentimis- ja autoriseerimistehnikaid, sealhulgas:
- JSON Web Tokens (JWT): Standard teabe turvaliseks edastamiseks osapoolte vahel JSON-objektina.
- API võtmed: Lihtne viis juurdepääsu piiramiseks teie API lõpp-punktidele.
- OAuth: Delegeerimisprotokoll, mis võimaldab kasutajatel anda kolmandate osapoolte rakendustele juurdepääsu oma ressurssidele ilma oma mandaate jagamata.
- NextAuth.js: Täielik avatud lähtekoodiga autentimislahendus Next.js rakendustele.
Siin on näide, kuidas kaitsta API marsruuti JWT autentimisega:
// 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: 'Unauthorized' })
}
try {
const decoded = jwt.verify(token, secret)
// "decoded" objekt sisaldab tokenisse põimitud kasutajateavet
// Näiteks: const userId = decoded.userId;
// Jätka päringu töötlemist
res.status(200).json({ message: 'Protected resource accessed successfully' })
} catch (error) {
return res.status(401).json({ message: 'Invalid token' })
}
}
Enne selle koodi käivitamist veenduge, et teil on jsonwebtoken
pakett installitud:
npm install jsonwebtoken
Samuti peate määrama keskkonnamuutuja JWT_SECRET
. See peaks olema tugev, juhuslikult genereeritud salajane võti, mida kasutatakse JWT-de allkirjastamiseks ja kontrollimiseks. Hoidke seda turvaliselt ja ärge kunagi avalikustage seda oma kliendipoolses koodis.
Vahevara
Kuigi Next.js ei paku traditsioonilist vahevara API marsruutidele samamoodi nagu Express.js, saate sarnase funktsionaalsuse saavutada, mähkides oma API marsruudi käsitlejad taaskasutatavate funktsioonidega. See võimaldab teil teha toiminguid nagu:
- Autentimine: Kasutaja mandaatide kontrollimine enne API lõpp-punktidele juurdepääsu lubamist.
- Autoriseerimine: Kontrollimine, kas kasutajal on konkreetse toimingu sooritamiseks vajalikud õigused.
- Logimine: Sissetulevate päringute ja väljaminevate vastuste logimine auditeerimise ja silumise eesmärgil.
- Valideerimine: Päringu andmete valideerimine, et tagada nende vastavus konkreetsetele kriteeriumidele.
- Päringute piiramine: Oma API kaitsmine kuritarvitamise eest, piirates päringute arvu, mida kasutaja saab teatud aja jooksul teha.
Siin on näide, kuidas luua lihtsat logimise vahevara:
// 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)
}
}
Selle vahevara kasutamiseks mähkige lihtsalt oma API marsruudi käsitleja withLogging
funktsiooniga:
// pages/api/logged.js
import { withLogging } from '../../utils/middleware'
async function handler(req, res) {
res.status(200).json({ message: 'This request was logged' })
}
export default withLogging(handler)
Parimad praktikad Next.js API marsruutide ehitamiseks
- Hoidke oma API marsruudid väikesed ja keskendunud. Iga API marsruut peaks tegelema konkreetse ülesande või ressursiga.
- Kasutage tundlike andmete jaoks keskkonnamuutujaid. Ärge kunagi kirjutage saladusi ega API võtmeid koodi sisse.
- Valideerige päringu andmeid turvaaukude vältimiseks. Kasutage päringukehade valideerimiseks teeki nagu Joi või Yup.
- Käsitlege vigu sujuvalt ja pakkuge informatiivseid veateateid. Kasutage try-catch plokke ja logige vead kesksesse asukohta.
- Kasutage jõudluse parandamiseks vahemälu. Salvestage sageli kasutatavad andmed vahemällu, et vähendada andmebaasi koormust.
- Jälgige oma API marsruutide jõudlust ja vigu. Kasutage oma API seisundi jälgimiseks seirevahendit nagu Sentry või Datadog.
- Dokumenteerige oma API marsruudid, kasutades tööriista nagu Swagger või OpenAPI. See muudab teistel arendajatel teie API kasutamise lihtsamaks.
- Kaaluge TypeScripti kasutamist tüübikindluse tagamiseks. TypeScript aitab teil vigu varakult avastada ja parandada teie koodi hooldatavust.
- Mõelge rahvusvahelistamisele (i18n) algusest peale. Kui teie rakendust kasutavad erinevatest riikidest pärit kasutajad, kujundage oma API marsruudid mitme keele ja valuuta toetamiseks. Näiteks e-kaubanduse API lõpp-punktid peavad võib-olla käsitlema erinevaid maksumäärasid ja saatmiskulusid vastavalt kasutaja asukohale.
- Rakendage korrektne CORS (Cross-Origin Resource Sharing) konfiguratsioon. See on ülioluline, kui teie API-le pääsetakse juurde teisest domeenist kui teie Next.js rakendus. Seadistage CORS hoolikalt, et lubada juurdepääsu teie API ressurssidele ainult volitatud päritoludest.
Täiustatud tehnikad
Taustatööd
Pikaajaliste ülesannete jaoks, mis ei tohiks API vastust blokeerida, kaaluge taustatööde kasutamist. Saate oma taustatööde haldamiseks ja nende asünkroonseks töötlemiseks kasutada teeke nagu BullMQ või Bree.
WebSockets
Reaalajas rakenduste jaoks saate kasutada WebSockets'i oma Next.js API marsruutides. Teegid nagu Socket.IO ja ws muudavad püsivate ühenduste loomise kliendi ja serveri vahel lihtsaks.
GraphQL
Kui vajate andmete hankimiseks paindlikumat ja tõhusamat viisi, kaaluge GraphQL-i kasutamist. Saate kasutada teeke nagu Apollo Server või Yoga, et luua oma Next.js rakenduses GraphQL API lõpp-punkt.
Kokkuvõte
Next.js API marsruudid pakuvad võimsat ja mugavat viisi serverivabade taustasüsteemide ehitamiseks otse oma Next.js rakenduses. Kasutades serverivaba arhitektuuri eeliseid, saate lihtsustada arendust, parandada jõudlust ja vähendada kulusid. Ükskõik, kas ehitate lihtsat kontaktivormi või keerukat e-kaubanduse platvormi, aitavad Next.js API marsruudid teil luua robustse ja skaleeruva taustasüsteemi kergusega. Põhjalike teadmiste ja parimate praktikate rakendamisega saate seda võimsat tööriista kasutada tõhusate, turvaliste ja globaalselt kättesaadavate rakenduste loomiseks.