express.Router

I denne korte leksjonen gir vi en introduksjon til express.Router. Vi forutsetter at du har lest leksjonen om REST på forhånd.

Hva er express.Router?

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:

Hvorfor trenger vi det?

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:

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.

Hvordan gjør vi det?

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:

Så koder vi endepunktene våre. Endepunktet for å hente ut alle tasks kan se slik ut:

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":

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: