Kode din første API med Node.js og Express Koble en database

Bygg en REST API med Node.js og Express: Koble til en database

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 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 , POST, SETTE, og SLETT metoder for å lage en komplett API.

Installasjon

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.

Sette opp databasen

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.

Koble til MySQL

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.

Få API-data fra MySQL

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, 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.

Bruke nettadresseparametere

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!

Sende en POST-forespørsel

Så langt har alt vi har gjort brukt 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.

Sende en PUT-forespørsel

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.

Sende en DELETE forespørsel

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.

Sende forespørsler gjennom be om modul

I 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.

Sende forespørsler via en webskjema

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.

Konklusjon

I denne opplæringen lærte vi å koble en Express-server til en MySQL-database og sette opp ruter som samsvarer med , 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!