I denne korte leksjonen gir vi en introduksjon til express.Router. Vi forutsetter at du har lest leksjonen om REST på forhånd.
Express.js er et Javascript-rammeverk vi kan bygge REST APIer med. I praksis koder vi endepunkter som mottar og behandler forespørsler fra en eller flere klienter over HTTP. Klassen express.Router gjør det enkelt å pakke inn endepunkter som logisk hører sammen. Endepunkter hører logisk sammen når de:
opererer på samme type ressurs (f.eks. "task")
deler sti, eller rute (f.eks. "/tasks")
Hvis REST APIet vårt bare skal håndtere forespørsler for én type ressurs så er det ikke nødvendig å bruke Router-klassen. Men som regel må vi håndtere mange ulike typer ressurser. Blacboard Learn sitt REST API illustrerer dette på en god måte. Blant ressursene finner vi:
announcements
attendance
courses
terms
calendar
content
Hver av disse ressursene har flere endepunkter. Hvis vi skulle programmert dette APIet kunne vi i teorien lagt alle endepunktene i samme fil, men da hadde vi sauset sammen mye kode som fint kunne vært separert, eller modularisert, i Router-klasser. Det er mange gode grunner til å modularisere, blant annet mer forståelig og robust kode som det er lettere å gjøre endringer i senere.
Hver router fortjener sin egen fil. Vi bruker ressursen "task" som eksempel. Først lager vi oss en katalog kalt "router". Deretter oppretter vi en ny JS-fil i denne katalogen med navnet "task-router.js". I fila instansierer vi en ny Router-klasse for ressursen:
31import express from 'express';
2
3const taskRouter = express.Router();
Så koder vi endepunktene våre. Endepunktet for å hente ut alle tasks kan se slik ut:
61taskRouter.get('/', (request, response) => {
2 response.json(allTasks);
3});
4
5
6export default taskRouter;
Vi knytter endepunktet mot taskRouter
på linje 1. Alle endepunktene som berører ressursen "task" skal altså kobles mot taskRouter
. Merk også at stien for å hente ut alle tasks nå er /
. Årsaken til det forklarer vi straks.
Neste steg er å opprette en Express-webtjener og sørge for at den vet om taskRouter
. Dette gjør vi i filen "app.js":
131import express from 'express';
2import taskRouter from './router/task-router';
3
4const app = express();
5app.use(express.json());
6
7const PORT = 3000;
8
9app.use('/api/v1/tasks', taskRouter);
10
11app.listen(PORT, () => {
12 console.info(`Server running on port ${PORT}`);
13});
På linje 9 forteller vi webtjeneren om routeren vår, taskRouter
. Felles sti for tasks-relaterte endepunkter sier vi er /api/v1/tasks
. Det er også grunnen til at vi tidligere satte stien for å hente ut alle tasks til /
. Det fulle og hele endepunktet for å hente ut alle tasks blir derfor http://localhost:3000/api/v1/tasks/
.
Med kun én type ressurs er nok bruken av express.Router unødvendig. Men hvis vi går tilbake til eksemplet med Blackboard Learn ser vi fordelene med en slik oppdeling. Da kunne vi skrevet noe sånt som dette:
211import express from 'express';
2import announcementRouter from './router/announcement-router';
3import attendanceRouter from './router/attendance-router';
4import courseRouter from './router/course-router';
5import termRouter from './router/term-router';
6
7
8const app = express();
9app.use(express.json());
10
11const PORT = 3000;
12
13app.use('/announcements', announcementRouter);
14app.use('/attendance', attendanceRouter);
15app.use('/courses', courseRouter);
16app.use('/terms', termRouter);
17
18
19app.listen(PORT, () => {
20 console.info(`Server running on port ${PORT}`);
21});