I den første opplæringen, Forstå RESTful APIs, lærte vi hva REST-arkitekturen er, hvilke HTTP-forespørselsmetoder og svar er, og hvordan man forstår et RESTful API-endepunkt. I den andre opplæringen, Hvordan sette opp en Express API-server, lærte vi å bygge servere med begge Node-innebygd http
modul og Express-rammeverket, og hvordan du kan rute appen vi opprettet til forskjellige URL-endepunkter.
For tiden bruker vi statiske data for å vise brukerinformasjon i form av en JSON-feed når API-endepunktet blir rammet med a FÅ
be om. I denne opplæringen skal vi sette opp en MySQL-database for å lagre alle dataene, koble til databasen fra vår Node.js-app, og la API-en bruke den FÅ
, POST
, SETTE
, og SLETT
metoder for å lage en komplett API.
Frem til dette punktet har vi ikke brukt en database for å lagre eller manipulere noen data, så vi skal sette opp en opp. Denne opplæringen vil bruke MySQL, og hvis du allerede har MySQL installert på datamaskinen din, vil du være klar til å gå videre til neste trinn.
Hvis du ikke har MySQL installert, kan du laste ned MAMP for macOS og Windows, som gir et gratis, lokalt servermiljø og en database. Når du har lastet ned dette, åpner du programmet og klikker Start servere for å starte MySQL.
I tillegg til å sette opp MySQL selv, vil vi ha GUI-programvare for å vise databasen og tabellene. For Mac, last ned SequelPro, og for Windows last ned SQLyog. Når du har MySQL lastet ned og kjører, kan du bruke SequelPro eller SQLyog til å koble til lokal vert
med brukernavnet rot
og passord rot
på havnen 3306
.
Når alt er satt opp her, kan vi fortsette å sette opp databasen for APIen vår.
I databasevisningssoftware, legg til en ny database og ring den api
. Pass på at MySQL kjører, eller du vil ikke kunne koble til lokal vert
.
Når du har api
database opprettet, flytt inn i det og kjør følgende spørring for å opprette et nytt bord.
CREATE TABLE 'users' ('id' int (11) usignert IKKE NULL AUTO_INCREMENT, 'navn' varchar (30) DEFAULT "," email "varchar (50) DEFAULT", PRIMARY KEY ('id')) MOTOR = InnoDB DEFAULT charset = utf8;
Denne SQL-spørringen vil skape strukturen til vår brukere
bord. Hver bruker vil ha et automatisk økende id, et navn og en e-postadresse.
Vi kan også fylle databasen med de samme dataene som vi for øyeblikket viser gjennom et statisk JSON-array ved å kjøre en SETT INN
spørsmål.
INSERT TIL brukere (navn, e-post) verdier ('Richard Hendricks', '[email protected]'), ('Bertram Gilfoyle', '[email protected]');
Det er ikke nødvendig å skrive inn id
feltet, da det er automatisk inkrementert. På dette tidspunktet har vi strukturen på bordet vårt, samt noen eksempler på data som skal brukes sammen med.
Tilbake i appen vår, må vi koble til MySQL fra Node.js for å begynne å jobbe med dataene. Tidligere installerte vi mysql
npm-modul, og nå skal vi bruke den.
Opprett en ny katalog som heter data og lag en config.js fil.
Vi begynner med å kreve mysql
modul i data / config.js.
const mysql = krever ('mysql');
La oss lage en config
objekt som inneholder verten, brukeren, passordet og databasen. Dette bør referere til api
database vi laget og bruker standard localhost innstillinger.
// Angi database tilkobling legitimasjon const config = vert: 'localhost', bruker: 'root', passord: 'root', database: 'api',;
For effektivitet skal vi opprette et MySQL-basseng, som gjør at vi kan bruke flere tilkoblinger samtidig, i stedet for å manuelt åpne og lukke flere tilkoblinger.
// Opprett en MySQL pool const pool = mysql.createPool (config);
Endelig eksporterer vi MySQL-bassenget slik at appen kan bruke den.
// Eksporter bassenget module.exports = pool;
Du kan se den fullførte databasekonfigurasjonsfilen i vår GitHub repo.
Nå som vi kobler til MySQL og innstillingene våre er ferdige, kan vi fortsette å samhandle med databasen fra API.
For tiden, vår routes.js
Filen oppretter manuelt et JSON-utvalg av brukere som ser slik ut.
const users = [...
Siden vi ikke lenger skal bruke statiske data, kan vi slette hele spekteret og erstatte det med en link til vårt MySQL-basseng.
// Last MySQL-bassengforbindelsen const pool = krever ('... / data / config');
Tidligere, FÅ
for / brukere
banen var å sende statisk brukere
data. Vår oppdaterte kode skal søke databasen for dataene i stedet. Vi skal bruke en SQL-spørring til Å VELGE
alt fra brukere
bord som ser slik ut.
VELGE * FRA brukere
Her er hva vår nye / brukere
få rute vil se ut, ved hjelp av pool.query ()
metode.
// Vis alle brukere app.get ('/ users', (request, response) => pool.query ('VELG * FRA brukere', (feil, resultat) => send (resultat);););
Her kjører vi Å VELGE
spørre og deretter sende resultatet som JSON til klienten via / brukere
endepunkt. Hvis du starter serveren på nytt og navigerer til / brukere
siden, ser du de samme dataene som før, men nå er det dynamisk.
Så langt har våre endepunkter vært statiske stier - enten /
rot eller / brukere
-men hva med når vi bare vil se data om en bestemt bruker? Vi må bruke et variabelt endepunkt.
For brukerne vil vi kanskje hente informasjon om hver enkelt bruker basert på deres unike id. For å gjøre det, ville vi bruke et kolon (:
) for å betegne at det er en ruteparameter.
// Vis en enkelt bruker ved ID app.get ('/ users /: id', (request, response) => ...); );
Vi kan hente parameteren for denne banen med request.params
eiendom. Siden vår er navngitt id
, det vil være hvordan vi refererer til det.
const id = request.params.id;
Nå legger vi til en HVOR
klausul til vår Å VELGE
uttalelse for å bare få resultater som har angitt id
.
Vi skal bruke ?
som plassholder for å unngå SQL-injeksjon og passere id gjennom som en parameter, i stedet for å bygge en sammenkoblet streng, som ville være mindre sikker.
pool.query ('VELG * fra brukere hvor id =?', id, (feil, resultat) => hvis (feil) kaste feil; response.send (resultat););
Den fulle koden for vår individuelle brukerressurs ser nå slik ut:
// Vis en enkelt bruker med ID app.get ('/ users /: id', (request, response) => const id = request.params.id; pool.query ('VELG * fra brukere hvor id =? ', id, (feil, resultat) => hvis (feil) kaste feil; response.send (result);););
Nå kan du starte serveren på nytt og navigere til http: // localhost / brukere / 2
for å se kun informasjonen til Gilfoyle. Hvis du får en feil som Kan ikke få / brukere / 2
, det betyr at du må starte serveren på nytt.
Å gå til denne nettadressen, bør returnere et enkelt resultat.
[id: 2, navn: "Bertram Gilfoyle", epost: "[email protected]"]
Hvis det er det du ser, gratulerer: du har vellykket opprettet en dynamisk ruteparameter!
Så langt har alt vi har gjort brukt FÅ
forespørsler. Disse forespørslene er sikre, noe som betyr at de ikke endrer serverens tilstand. Vi har nettopp sett på JSON-data.
Nå skal vi begynne å gjøre API virkelig dynamisk ved å bruke en POST
Be om å legge til nye data.
Jeg nevnte tidligere i Forstå REST artikkelen at vi ikke bruker verb som Legg til
eller slette
i nettadressen for å utføre handlinger. For å legge til en ny bruker i databasen, vil vi POST
Til samme URL vi ser dem fra, men bare sett opp en egen rute for den.
// Legg til en ny bruker app.post ('/ users', (request, response) => ...);
Legg merke til at vi bruker app.post ()
i stedet for app.get ()
nå.
Siden vi lager i stedet for å lese, bruker vi en SETT INN
spørre her, akkurat som vi gjorde ved initialiseringen av databasen. Vi sender hele request.body
gjennom til SQL-spørringen.
pool.query ('INSERT INTO users SET?', request.body, (feil, resultat) => hvis (feil) kaste feil;
Vi skal også angi status for svaret som 201
, som står for laget
. For å få ID for det sist innsatte elementet, bruker vi insertId
eiendom.
response.status (201) .send ('Bruker lagt til med ID: $ result.insertId');
Hele vårt POST
mottakskoden vil se slik ut.
// Legg til en ny bruker app.post ('/ users', (request, response) => pool.query ('INSERT TIL brukere SET?', Request.body, (feil, resultat) => if ) kastefeil; response.status (201) .send ('Bruker lagt med ID: $ result.insertId');););
Nå kan vi sende en POST
forespørsel gjennom. Mesteparten av tiden når du sender en POST
forespørsel, du gjør det gjennom et webskjema. Vi lærer hvordan du setter opp dette ved slutten av denne artikkelen, men den raskeste og enkleste måten å sende en test på POST
er med cURL, bruker -d (- data)
flagg.
Vi kjører krølle -d
, etterfulgt av en spørringsstreng som inneholder alle nøkkel / verdi par og forespørsel endepunkt.
curl -d "name = Dinesh [email protected]" http: // localhost: 3002 / users
Når du sender denne forespørselen gjennom, bør du få svar fra serveren.
Bruker lagt til med ID: 3
Hvis du navigerer til http: // localhost / brukere
, Du får se den siste oppføringen lagt til i listen.
POST
er nyttig for å legge til en ny bruker, men vi vil bruke SETTE
å endre en eksisterende bruker. SETTE
er idempotent, noe som betyr at du kan sende samme forespørsel gjennom flere ganger, og bare en handling vil bli utført. Dette er annerledes enn POST
, fordi hvis vi sendte vår nye brukerforespørsel gjennom mer enn en gang, ville det fortsette å skape nye brukere.
For vår API skal vi sette opp SETTE
for å kunne håndtere redigering av en enkelt bruker, så vi skal bruke : id
ruteparameter denne gangen.
La oss lage en OPPDATER
spørre og sørg for at det bare gjelder det forespurte id med HVOR
klausul. Vi bruker to ?
plassholderne, og verdiene vi passerer, går i rekkefølge.
// Oppdater en eksisterende bruker app.put ('/ users /: id', (request, response) => const id = request.params.id; pool.query ('UPDATE brukere SET? WHERE id =?' [request.body, id], (feil, resultat) => hvis (feil) kaste feil; response.send ('Bruker oppdatert vellykket.');););
For vår test, redigerer vi brukeren 2
og oppdater epostadressen fra [email protected] til [email protected]. Vi kan bruke cURL igjen, med [-X (--request)]
flagg, for å spesifisere spesifikt at vi sender en PUT-forespørsel gjennom.
curl -X PUT -d "navn = Bertram Gilfoyle" -d "[email protected]" http: // localhost: 3002 / users / 2
Pass på at du starter serveren på nytt før du sender forespørselen, ellers får du den Kan ikke sette / brukere / 2
feil.
Du bør se dette:
Brukeren er oppdatert vellykket.
Brukerdata med ID 2
nå skal oppdateres.
Vår siste oppgave å fullføre CRUD-funksjonaliteten til API-en er å gjøre det mulig å slette en bruker fra databasen. Denne forespørselen vil bruke SLETT
SQL-spørring med HVOR
, og det vil slette en individuell bruker spesifisert av en rute parameter.
// Slett en bruker app.delete ('/ users /: id', (forespørsel, svar) => const id = request.params.id; pool.query ('DELETE FROM users WHERE id =?' (feil, resultat) => hvis (feil) kaste feil; response.send ('Bruker slettet.';;;;);
Vi kan bruke -X
igjen med cURL for å sende slett gjennom. La oss slette den siste brukeren vi opprettet.
krølle -X SLETT http: // localhost: 3002 / users / 3
Du får se suksessmeldingen.
Bruker slettet.
Navigere til http: // localhost: 3002
, og du ser at det bare er to brukere nå.
Gratulerer! På dette tidspunktet er APIen fullført. Besøk GitHub repo for å se hele koden for routes.js.
be om
modulI begynnelsen av denne artikkelen installerte vi fire avhengigheter, og en av dem var be om
modul. I stedet for å bruke CURL-forespørsler, kan du lage en ny fil med alle dataene og sende den gjennom. Jeg lager en fil som heter post.js som vil skape en ny bruker via POST
.
const request = krever ('request'); const json = "navn": "Dinesh Chugtai", "email": "[email protected]",; request.post (url: 'http: // localhost: 3002 / users', body: json, json: true,, funksjon (feil, svar, kropp) console.log (body););
Vi kan ringe dette ved hjelp av node post.js
i et nytt terminalvindu mens serveren kjører, og den vil ha samme effekt som å bruke cURL. Hvis noe ikke fungerer med cURL, vil be om
Modulen er nyttig som vi kan se feilen, responsen og kroppen.
Som oftest, POST
og andre HTTP-metoder som endrer tilstanden til serveren, sendes ved hjelp av HTML-skjemaer. I dette veldig enkle eksempelet kan vi lage en index.html fil hvor som helst, og lag et felt for et navn og en e-postadresse. Skjemaets tiltak vil peke på ressursen, i dette tilfellet http // localhost: 3002 / brukere
, og vi spesifiserer metoden som post
.
Skape index.html og legg til følgende kode for det:
Node.js Express REST API
Åpne denne statiske HTML-filen i nettleseren din, fyll den ut, og send den mens serveren kjører i terminalen. Du bør se svaret til Bruker lagt til med ID: 4
, og du bør kunne se den nye listen over brukere.
I denne opplæringen lærte vi å koble en Express-server til en MySQL-database og sette opp ruter som samsvarer med FÅ
, POST
, SETTE
, og SLETT
metoder for stier og dynamiske ruteparametere. Vi lærte også å sende HTTP-forespørsler til en API-server ved hjelp av cURL, Node.js be om
modul og HTML-skjemaer.
På dette tidspunktet bør du ha en veldig god forståelse for hvordan RESTful APIs fungerer, og du kan nå lage din egen fullverdige API i Node.js med Express og MySQL!