Uzziniet, kā izmantot Next.js API maršrutus, lai veidotu bezservera aizmugursistēmas tieši Jūsu Next.js lietotnē. Šī rokasgrāmata aptver visu, sākot no pamata iestatīšanas līdz progresīvām tehnikām.
Next.js API maršruti: viegla Jūsu aizmugursistēmas izveide
Next.js ir radījis revolūciju priekšgalsistēmas izstrādē ar savām jaudīgajām funkcijām un intuitīvo struktūru. Bet vai zinājāt, ka tas var arī būtiski vienkāršot aizmugursistēmas izstrādi? Next.js API maršruti ļauj jums izveidot bezservera API galapunktus tieši Jūsu Next.js lietotnē, daudzos gadījumos novēršot nepieciešamību pēc atsevišķa aizmugursistēmas servera. Šī visaptverošā rokasgrāmata Jūs soli pa solim vedīs cauri procesam, kā izveidot robustu un mērogojamu aizmugursistēmu, izmantojot Next.js API maršrutus.
Kas ir Next.js API maršruti?
API maršruti ir bezservera funkcijas, kuras Jūs izveidojat savā Next.js projektā direktorijā /pages/api
. Šīs funkcijas apstrādā ienākošos HTTP pieprasījumus un atgriež atbildes, gluži kā tradicionāls aizmugursistēmas API. Galvenā atšķirība ir tā, ka tie tiek izvietoti kā bezservera funkcijas, kas nozīmē, ka Jums nav jāpārvalda serveri vai infrastruktūra.
Uztveriet tos kā vieglas, pēc pieprasījuma aizmugursistēmas funkcijas, kas ir nevainojami integrētas ar Jūsu Next.js priekšgalsistēmu.
Next.js API maršrutu izmantošanas priekšrocības
- Vienkāršota izstrāde: Rakstiet gan priekšgalsistēmas, gan aizmugursistēmas kodu vienā projektā, izmantojot JavaScript vai TypeScript. Vairs nav jāpārslēdzas starp dažādiem projektiem un tehnoloģijām.
- Bezservera arhitektūra: Gūstiet labumu no bezservera skaitļošanas mērogojamības, uzticamības un izmaksu efektivitātes. Maksājiet tikai par izmantotajiem resursiem.
- Vienkārša izvietošana: Izvietojiet visu savu lietotni (priekšgalsistēmu un aizmugursistēmu) ar vienu komandu, izmantojot tādas platformas kā Vercel vai Netlify.
- Iebūvēta drošība: Next.js un bezservera platformas nodrošina iebūvētas drošības funkcijas, lai aizsargātu Jūsu API galapunktus.
- Uzlabota veiktspēja: API maršrutus var izvietot tuvāk lietotājiem, samazinot latentumu un uzlabojot veiktspēju, kas ir īpaši izdevīgi lietotājiem visā pasaulē.
- Koda atkārtota izmantošana: Koplietojiet kodu starp priekšgalsistēmu un aizmugursistēmu, samazinot koda dublēšanos un uzlabojot uzturējamību.
Darba sākšana ar Next.js API maršrutiem
Izveidosim vienkāršu API maršrutu, kas atgriež JSON atbildi. Vispirms pārliecinieties, ka Jums ir izveidots Next.js projekts. Ja nē, izveidojiet to, izmantojot:
npx create-next-app my-app
cd my-app
Tagad izveidojiet failu ar nosaukumu hello.js
direktorijā /pages/api
:
// pages/api/hello.js
export default function handler(req, res) {
res.status(200).json({ name: 'John Doe' })
}
Šis kods definē vienkāršu API maršrutu, kas atbild ar JSON objektu, kurā ir vārds "John Doe". Lai piekļūtu šim API maršrutam, palaidiet savu Next.js izstrādes serveri:
npm run dev
Pēc tam atveriet pārlūkprogrammu un dodieties uz http://localhost:3000/api/hello
. Jums vajadzētu redzēt šādu JSON atbildi:
{"name": "John Doe"}
API maršruta apstrādātāja (handler) izpratne
handler
funkcija Jūsu API maršrutā saņem divus argumentus:
req
:http.IncomingMessage
instance, kas satur informāciju par ienākošo pieprasījumu, piemēram, pieprasījuma metodi, galvenes un ķermeni.res
:http.ServerResponse
instance, kas ļauj Jums nosūtīt atbildi atpakaļ klientam.
Jūs varat izmantot šos objektus, lai apstrādātu dažāda veida pieprasījumus, lasītu datus no pieprasījuma ķermeņa, iestatītu atbildes galvenes un nosūtītu dažāda veida atbildes.
Dažādu HTTP metožu apstrāde
Jūs varat izmantot req.method
īpašību, lai noteiktu ienākošā pieprasījuma HTTP metodi un attiecīgi apstrādātu dažādas metodes. Piemēram:
// pages/api/method.js
export default function handler(req, res) {
if (req.method === 'GET') {
// Apstrādāt GET pieprasījumu
res.status(200).json({ message: 'Šis ir GET pieprasījums' })
} else if (req.method === 'POST') {
// Apstrādāt POST pieprasījumu
res.status(200).json({ message: 'Šis ir POST pieprasījums' })
} else {
// Apstrādāt citas metodes
res.status(405).json({ message: 'Metode nav atļauta' })
}
}
Šajā piemērā API maršruts apstrādā gan GET, gan POST pieprasījumus. Ja pieprasījuma metode ir GET, tas atbild ar JSON objektu, kas satur ziņojumu "Šis ir GET pieprasījums". Ja pieprasījuma metode ir POST, tas atbild ar JSON objektu, kas satur ziņojumu "Šis ir POST pieprasījums". Ja pieprasījuma metode ir jebkura cita, tas atbild ar 405 Metode nav atļauta kļūdu.
Datu nolasīšana no pieprasījuma ķermeņa
POST, PUT un PATCH pieprasījumiem bieži ir nepieciešams nolasīt datus no pieprasījuma ķermeņa. Next.js nodrošina iebūvētu atbalstu JSON un URL kodētu pieprasījumu ķermeņu parsēšanai. Lai parsētu JSON pieprasījuma ķermeni, varat izmantot req.body
īpašību. Piemēram:
// pages/api/post.js
export default async function handler(req, res) {
if (req.method === 'POST') {
const { name, email } = req.body
// Apstrādāt datus
console.log('Name:', name)
console.log('Email:', email)
res.status(200).json({ message: 'Dati veiksmīgi saņemti' })
} else {
res.status(405).json({ message: 'Metode nav atļauta' })
}
}
Lai pārbaudītu šo API maršrutu, varat izmantot rīku, piemēram, Postman vai curl, lai nosūtītu POST pieprasījumu ar JSON ķermeni:
curl -X POST -H "Content-Type: application/json" -d '{"name": "Jane Doe", "email": "jane.doe@example.com"}' http://localhost:3000/api/post
Atbildes galveņu iestatīšana
Jūs varat izmantot metodi res.setHeader()
, lai iestatītu atbildes galvenes. Tas ir noderīgi, lai iestatītu satura veidu, kešatmiņas kontroli un citu svarīgu informāciju. Piemēram:
// 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!' })
}
Šajā piemērā API maršruts iestata Content-Type
galveni uz application/json
, norādot, ka atbilde ir JSON objekts. Tas arī iestata Cache-Control
galveni uz s-maxage=3600
, kas pārlūkprogrammai un CDN norāda kešot atbildi līdz pat 1 stundai.
Kļūdu apstrāde
Ir svarīgi korekti apstrādāt kļūdas Jūsu API maršrutos. Jūs varat izmantot try-catch blokus, lai notvertu izņēmumus un nosūtītu klientam atbilstošas kļūdu atbildes. Piemēram:
// pages/api/error.js
export default async function handler(req, res) {
try {
// Simulēt kļūdu
throw new Error('Kaut kas nogāja greizi')
} catch (error) {
console.error(error)
res.status(500).json({ message: 'Iekšējā servera kļūda' })
}
}
Šajā piemērā API maršruts simulē kļūdu, izmetot jaunu Error
objektu. Catch bloks notver kļūdu, reģistrē to konsolē un nosūta klientam 500 Iekšējā servera kļūdas atbildi. Ražošanas vidēm apsveriet iespēju izmantot robustu reģistrēšanas sistēmu, piemēram, Sentry vai Datadog.
Savienojuma izveide ar datubāzi
Viens no visbiežāk sastopamajiem API maršrutu pielietojumiem ir savienojuma izveide ar datubāzi. Next.js API maršruti nevainojami integrējas ar dažādām datubāzēm, tostarp:
- MongoDB: Populāra NoSQL datubāze, kas ir labi piemērota elastīgiem un nestrukturētiem datiem.
- PostgreSQL: Jaudīga un atvērtā koda relāciju datubāze, kas pazīstama ar savu uzticamību un datu integritāti.
- MySQL: Vēl viena populāra atvērtā koda relāciju datubāze, ko plaši izmanto tīmekļa lietojumprogrammām.
- Firebase: Mākoņpakalpojumu platforma, kas nodrošina reāllaika datubāzi un citus pakalpojumus.
- FaunaDB: Bezservera datubāze, kas paredzēta globālām lietojumprogrammām.
Šeit ir piemērs, kā izveidot savienojumu ar MongoDB datubāzi Next.js API maršrutā:
// 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('Lūdzu, pievienojiet savu Mongo URI failam .env.local')
}
if (process.env.NODE_ENV === 'development') {
// Izstrādes režīmā izmantojiet globālu mainīgo, lai vērtība
// tiktu saglabāta starp moduļu pārlādēm, ko izraisa HMR (Hot Module Replacement).
if (!global._mongoClientPromise) {
client = new MongoClient(uri, options)
global._mongoClientPromise = client.connect()
}
clientPromise = global._mongoClientPromise
} else {
// Ražošanas režīmā labāk neizmantot globālu mainīgo.
client = new MongoClient(uri, options)
clientPromise = client.connect()
}
// Eksportējiet moduļa līmeņa MongoClient solījumu. To darot
// atsevišķā modulī, klientu var droši atkārtoti izmantot vairākās
// funkcijās. Skatīt: 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: 'Neizdevās ielādēt lietotājus' })
}
}
Pirms šī koda palaišanas pārliecinieties, ka Jums ir instalēta mongodb
pakotne:
npm install mongodb
Jums ir arī jāiestata MONGODB_URI
un MONGODB_DB
vides mainīgie. Šiem mainīgajiem jābūt definētiem Jūsu .env.local
failā (vai Jūsu mitināšanas pakalpojumu sniedzēja vides mainīgo iestatījumos ražošanas videi). MONGODB_URI
satur savienojuma virkni ar Jūsu MongoDB datubāzi, un MONGODB_DB
norāda datubāzes nosaukumu.
Autentifikācija un autorizācija
Jūsu API maršrutu aizsardzība ir būtiska drošībai. Next.js API maršrutus var aizsargāt, izmantojot dažādas autentifikācijas un autorizācijas metodes, tostarp:
- JSON Web Tokens (JWT): Standarts drošai informācijas pārsūtīšanai starp pusēm kā JSON objekts.
- API atslēgas: Vienkāršs veids, kā ierobežot piekļuvi Jūsu API galapunktiem.
- OAuth: Deleģēšanas protokols, kas ļauj lietotājiem piešķirt trešo pušu lietojumprogrammām piekļuvi saviem resursiem, nedaloties ar saviem akreditācijas datiem.
- NextAuth.js: Pilnīgs atvērtā koda autentifikācijas risinājums Next.js lietojumprogrammām.
Šeit ir piemērs, kā aizsargāt API maršrutu, izmantojot JWT autentifikāciju:
// 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: 'Neautorizēts' })
}
try {
const decoded = jwt.verify(token, secret)
// "decoded" objekts satur lietotāja informāciju, kas iestrādāta marķierī
// Piemēram: const userId = decoded.userId;
// Turpināt pieprasījuma apstrādi
res.status(200).json({ message: 'Aizsargātais resurss veiksmīgi sasniegts' })
} catch (error) {
return res.status(401).json({ message: 'Nederīgs marķieris' })
}
}
Pirms šī koda palaišanas pārliecinieties, ka Jums ir instalēta jsonwebtoken
pakotne:
npm install jsonwebtoken
Jums ir arī jāiestata JWT_SECRET
vides mainīgais. Tai jābūt spēcīgai, nejauši ģenerētai slepenajai atslēgai, kas tiek izmantota JWT parakstīšanai un pārbaudei. Glabājiet to droši un nekad neatklājiet to savā klienta puses kodā.
Starpprogrammatūra (Middleware)
Lai gan Next.js nepiedāvā tradicionālu starpprogrammatūru API maršrutiem tādā pašā veidā kā Express.js, Jūs varat sasniegt līdzīgu funkcionalitāti, ietinot savus API maršrutu apstrādātājus atkārtoti lietojamās funkcijās. Tas ļauj veikt tādus uzdevumus kā:
- Autentifikācija: Pārbaudīt lietotāja akreditācijas datus pirms piekļuves atļaušanas API galapunktiem.
- Autorizācija: Pārbaudīt, vai lietotājam ir nepieciešamās atļaujas, lai veiktu konkrētu darbību.
- Reģistrēšana: Reģistrēt ienākošos pieprasījumus un izejošās atbildes audita un atkļūdošanas nolūkos.
- Validācija: Validēt pieprasījuma datus, lai nodrošinātu, ka tie atbilst noteiktiem kritērijiem.
- Pieprasījumu skaita ierobežošana: Aizsargāt savu API no ļaunprātīgas izmantošanas, ierobežojot pieprasījumu skaitu, ko lietotājs var veikt noteiktā laika periodā.
Šeit ir piemērs, kā izveidot vienkāršu reģistrēšanas starpprogrammatūru:
// 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)
}
}
Lai izmantotu šo starpprogrammatūru, vienkārši ietiniet savu API maršruta apstrādātāju ar withLogging
funkciju:
// pages/api/logged.js
import { withLogging } from '../../utils/middleware'
async function handler(req, res) {
res.status(200).json({ message: 'Šis pieprasījums tika reģistrēts' })
}
export default withLogging(handler)
Labākās prakses Next.js API maršrutu izveidē
- Uzturiet savus API maršrutus mazus un fokusētus. Katram API maršrutam jāapstrādā konkrēts uzdevums vai resurss.
- Izmantojiet vides mainīgos sensitīviem datiem. Nekad neiekodējiet slepenus datus vai API atslēgas savā kodā.
- Validējiet pieprasījuma datus, lai novērstu drošības ievainojamības. Izmantojiet bibliotēku, piemēram, Joi vai Yup, lai validētu pieprasījumu ķermeņus.
- Korekti apstrādājiet kļūdas un sniedziet informatīvus kļūdu ziņojumus. Izmantojiet try-catch blokus un reģistrējiet kļūdas centralizētā vietā.
- Izmantojiet kešatmiņu, lai uzlabotu veiktspēju. Kešojiet bieži piekļūstamus datus, lai samazinātu datubāzes slodzi.
- Pārraugiet savu API maršrutu veiktspēju un kļūdas. Izmantojiet uzraudzības rīku, piemēram, Sentry vai Datadog, lai sekotu līdzi sava API stāvoklim.
- Dokumentējiet savus API maršrutus, izmantojot rīku, piemēram, Swagger vai OpenAPI. Tas atvieglo citiem izstrādātājiem Jūsu API izmantošanu.
- Apsveriet TypeScript izmantošanu tipu drošībai. TypeScript var palīdzēt Jums agrīni atklāt kļūdas un uzlabot koda uzturējamību.
- No paša sākuma domājiet par internacionalizāciju (i18n). Ja Jūsu lietotni izmantos lietotāji no dažādām valstīm, izstrādājiet savus API maršrutus tā, lai tie atbalstītu vairākas valodas un valūtas. Piemēram, e-komercijas API galapunktiem var būt nepieciešams apstrādāt dažādas nodokļu likmes un piegādes izmaksas, pamatojoties uz lietotāja atrašanās vietu.
- Ieviesiet pareizu CORS (Cross-Origin Resource Sharing) konfigurāciju. Tas ir būtiski, ja Jūsu API tiek piekļūts no cita domēna, nevis Jūsu Next.js lietojumprogrammas. Rūpīgi konfigurējiet CORS, lai atļautu piekļuvi Jūsu API resursiem tikai autorizētiem avotiem.
Progresīvas tehnikas
Fona darbi
Ilgstošiem uzdevumiem, kuriem nevajadzētu bloķēt API atbildi, apsveriet fona darbu izmantošanu. Jūs varat izmantot bibliotēkas, piemēram, BullMQ vai Bree, lai pārvaldītu savus fona darbus un apstrādātu tos asinhroni.
WebSockets
Reāllaika lietojumprogrammām Jūs varat izmantot WebSockets savos Next.js API maršrutos. Bibliotēkas, piemēram, Socket.IO un ws, atvieglo pastāvīgu savienojumu izveidi starp klientu un serveri.
GraphQL
Ja Jums nepieciešams elastīgāks un efektīvāks veids datu iegūšanai, apsveriet GraphQL izmantošanu. Jūs varat izmantot bibliotēkas, piemēram, Apollo Server vai Yoga, lai izveidotu GraphQL API galapunktu savā Next.js lietojumprogrammā.
Noslēgums
Next.js API maršruti nodrošina jaudīgu un ērtu veidu, kā veidot bezservera aizmugursistēmas tieši Jūsu Next.js lietojumprogrammā. Izmantojot bezservera arhitektūras priekšrocības, Jūs varat vienkāršot izstrādi, uzlabot veiktspēju un samazināt izmaksas. Neatkarīgi no tā, vai veidojat vienkāršu saziņas formu vai sarežģītu e-komercijas platformu, Next.js API maršruti var palīdzēt Jums viegli izveidot robustu un mērogojamu aizmugursistēmu. Ar stabilu pamatu izpratni un labāko prakšu pielietošanu Jūs varat izmantot šo jaudīgo rīku, lai radītu efektīvas, drošas un globāli pieejamas lietojumprogrammas.