Codificați-vă primul API cu Node.js și Express Conectați o bază de date

Construiți un API REST Cu Node.js și Express: Conectarea unei baze de date

În primul tutorial, Înțelegerea API-urilor RESTful, am aflat ce arhitectură REST este, ce metode de răspuns HTTP și răspunsuri sunt și cum să înțelegeți un punct final de API RESTful. În al doilea tutorial, Cum se configurează un server API Express, am învățat cum să construim servere cu atât Node încorporat http modulul și cadrul Express și modul de direcționare a aplicației pe care am creat-o către diferite puncte finale de adrese URL.

În prezent, folosim date statice pentru a afișa informațiile despre utilizator sub formă de feed JSON atunci când punctul final al API este lovit cu OBȚINE cerere. În acest tutorial, vom configura o bază de date MySQL pentru a stoca toate datele, pentru a vă conecta la baza de date din aplicația noastră Node.js și pentru a permite API-ului să utilizeze OBȚINE, POST, A PUNE, și ȘTERGE metode pentru a crea un API complet.

Instalare

Până în acest moment, nu am folosit o bază de date pentru a stoca sau a manipula orice date, așa că o să stabilim unul. Acest tutorial va folosi MySQL, iar dacă aveți deja MySQL instalat pe computer, veți fi gata să faceți pasul următor.

Dacă nu aveți instalat MySQL, puteți descărca MAMP pentru MacOS și Windows, care oferă un mediu de stocare și o bază de date locale gratuită. Odată ce ați descărcat acest program, deschideți programul și dați clic pe Porniți serverele pentru a porni MySQL.

În plus față de instalarea MySQL în sine, vom dori software-ul GUI pentru a vizualiza baza de date și tabele. Pentru Mac, descărcați SequelPro, iar pentru Windows descărcați SQLyog. După ce descărcați și rulați MySQL, puteți utiliza SequelPro sau SQLyog pentru a vă conecta gazdă locală cu numele de utilizator rădăcină și parola rădăcină pe port 3306.

Odată ce totul este setat aici, putem trece la configurarea bazei de date pentru API-ul nostru.

Configurarea bazei de date

În aplicația de vizualizare a bazei de date, adăugați o nouă bază de date și apelați-o api. Asigurați-vă că MySQL rulează sau nu vă veți putea conecta gazdă locală.

Când aveți api baza de date creată, mutați-o în ea și executați următoarea interogare pentru a crea un nou tabel.

CREATE TABLE utilizatori '(' id 'int (11) nesemnate NOT NULL AUTO_INCREMENT,' nume 'varchar (30) DEFAULT ",' email 'varchar (50) DEFAULT", KEY PRIMARY charset = utf8; 

Această interogare SQL va crea structura noastră utilizatori masa. Fiecare utilizator va avea un id de auto-incrementare, un nume și o adresă de e-mail.

De asemenea, putem umple baza de date cu aceleași date pe care le afișăm în prezent printr-o matrice statică JSON executând un INTRODUCE întrebare.

INTRODUCEȚI ÎN UTILIZATORI (nume, e-mail) VALUES ("Richard Hendricks", "[email protected]"), ("Bertram Gilfoyle", "[email protected]"); 

Nu este nevoie să introduceți codul id câmp, deoarece este auto-incrementare. În acest moment, avem structura tabelului nostru, precum și unele date de probă cu care să lucrăm.

Conectarea la MySQL

Înapoi în aplicația noastră, trebuie să ne conectăm la MySQL de la Node.js pentru a începe să lucrăm cu datele. Anterior am instalat MySQL npm modul și acum o vom folosi.

Creați un nou director numit date și fă un a config.js fişier.

Vom începe prin a cere MySQL modul în date / config.js.

const mysql = necesită ('mysql'); 

Să creăm a config obiect care conține gazda, utilizatorul, parola și baza de date. Acest lucru ar trebui să se refere la api baza de date pe care am realizat-o și folosim setările prestabilite pentru localhost.

// Setați datele de conectare pentru baza de date const config = host: 'localhost', utilizator: 'root', parola: 'root', baza de date: 'api',; 

Pentru eficiență, vom crea o piscină MySQL, care ne permite să folosim simultan mai multe conexiuni, în loc să fie nevoie să deschideți manual și să închideți mai multe conexiuni.

// Crearea unei baze de date MySQL const pool = mysql.createPool (config); 

În cele din urmă, vom exporta piscina MySQL, astfel încât aplicația să o poată utiliza.

// Exportați modulul pool.exports = pool; 

Puteți vedea fișierul de configurare a bazei de date completat în repo GitHub.

Acum, când ne conectăm la MySQL și setările noastre sunt complete, putem trece la interacțiunea cu baza de date din API.

Obținerea datelor API din MySQL

În prezent, noastre routes.js fișierul creează manual o gamă de utilizatori JSON, care arată astfel.

const utilizatori = [... 

Din moment ce nu vom mai folosi date statice, putem șterge acea matrice întreagă și o putem înlocui cu un link către bazinul MySQL.

// Încărcați conexiunea bazei de date MySQL const pond = cer ('... / data / config'); 

Anterior, OBȚINE pentru / utilizatori calea trimitea statica utilizatori date. Codul nostru actualizat va interoga baza de date pentru acele date. Vom folosi o interogare SQL SELECTAȚI toate de la utilizatori tabel, care arată astfel.

SELECT * FROM utilizatori 

Aici este ceea ce noi / utilizatori obține cale va arata, folosind pool.query () metodă.

// Afișează toți utilizatorii app.get ('/ users', (request, response) => pool.query ('SELECT * FROM users', eroare, rezultat) => if (error) throw error; trimite (rezultat););); 

Aici, conducem SELECTAȚI interogarea și apoi trimiterea rezultatului ca JSON clientului prin intermediul / utilizatori punct final. Dacă reporniți serverul și navigați la / utilizatori pagina, veți vedea aceleași date ca înainte, dar acum este dinamic.

Utilizarea parametrilor URL

Până acum, obiectivele noastre au fost căi statice - fie / rădăcină sau / utilizatori-dar ce se întâmplă atunci când vrem să vedem date numai despre un anumit utilizator? Va trebui să folosim un punct final variabil.

Pentru utilizatorii noștri, este posibil să dorim să preluăm informații despre fiecare utilizator individual pe baza id-ului lor unic. Pentru a face acest lucru, am folosi un colon (:) pentru a indica faptul că este un parametru al traseului.

// Afișați un singur utilizator după ID app.get ('/ users /: id', (cerere, răspuns) => ...); ); 

Putem extrage parametrul pentru această cale cu request.params proprietate. Din moment ce numele nostru este numit id, care va fi modul în care ne referim la el.

const id = request.params.id; 

Acum vom adăuga o UNDE clauza noastră SELECTAȚI pentru a obține numai rezultate care au specificat id.

Vom folosi ? ca un substituent pentru a evita injectarea SQL și să treacă id-ul ca parametru, în loc de a construi un șir concatenat, care ar fi mai puțin sigur.

pool.query ('SELECT * FROM users WHERE id =?', id, (eroare, rezultat) => if (error) aruncă eroare; answer.send (rezultat);); 

Codul complet pentru resursa noastră individuală de utilizator arată acum:

// Afișați un singur utilizator după ID app.get ('/ users /: id', (cerere, răspuns) => const id = request.params.id; pool.query ('SELECT * FROM users WHERE id =? ', id, (eroare, rezultat) => if (error) aruncă eroare; answer.send (rezultat););); 

Acum puteți reporni serverul și navigați la http: // localhost / utilizatori / 2 pentru a vedea doar informațiile despre Gilfoyle. Dacă primiți o eroare cum ar fi Nu se poate obține / utilizatori / 2, înseamnă că trebuie să reporniți serverul.

Mergeți la această adresă URL ar trebui să returneze un singur rezultat.

[id: 2, numele: "Bertram Gilfoyle", email: "[email protected]"] 

Dacă vedeți acest lucru, felicitări: ați configurat cu succes un parametru dinamic al rutei!

Trimiterea unei solicitări POST

Până acum, tot ce am făcut a folosit OBȚINE solicitări. Aceste cereri sunt sigure, ceea ce înseamnă că nu modifică starea serverului. Pur și simplu am vizionat datele JSON.

Acum vom începe să transformăm API într-adevăr dinamic prin utilizarea unui a POST cereți să adăugați date noi.

Am menționat mai devreme în articolul înțeles REST că nu folosim verbe cum ar fi adăuga sau șterge în adresa URL pentru efectuarea acțiunilor. Pentru a adăuga un utilizator nou la baza de date, vom POST la aceeași adresă URL pe care le vedem, dar trebuie doar să configurați o rutare separată pentru aceasta.

// Adăugați un nou utilizator app.post ('/ users', (request, answer) => ...); 

Rețineți că folosim app.post () in loc de app.get () acum.

De vreme ce noi creăm în loc să citim, vom folosi unul INTRODUCE interogați aici, la fel ca în cazul inițializării bazei de date. Vom trimite întregul request.body până la interogarea SQL.

pool.query ('INSERT INTO users SET?', request.body, (eroare, rezultat) => if (error) arunca eroare; 

De asemenea, vom specifica starea răspunsului ca fiind 201, care înseamnă Creată. Pentru a obține id-ul ultimului element introdus, vom folosi insertId proprietate.

answer.status (201) .send ('Utilizatorul adăugat cu ID: $ result.insertId'); 

Întregul nostru POST primiți codul va arăta astfel.

// Adauga un nou utilizator app.post ('/ users', (request, response) => pool.query ('INSERT INTO users SET?', Request.body, (error, result) => if ) aruncați eroarea; answer.status (201) .send ("Utilizatorul a adăugat cu ID: $ result.insertId"););); 

Acum putem trimite o POST cereți prin. De cele mai multe ori când trimiteți un mesaj POST solicitați, o faceți printr-un formular web. Vom învăța cum să stabilim acest lucru până la sfârșitul acestui articol, dar cel mai rapid și mai ușor mod de a trimite un test POST este cu cURL, folosind -d (--date) steag.

Vom alerga curl -d, urmat de un șir de interogare care conține toate perechile cheie / valoare și punctul final al cererii.

curl -d "nume = Dinesh [email protected]" http: // localhost: 3002 / utilizatori 

Odată ce trimiteți această solicitare, ar trebui să primiți un răspuns de la server.

Utilizator adăugat cu ID: 3 

Dacă navigați la http: // localhost / utilizatori, veți vedea ultima intrare adăugată în listă.

Trimiterea unei cereri PUT

POST este util pentru adăugarea unui nou utilizator, dar vom dori să îl folosim A PUNE pentru a modifica un utilizator existent. A PUNE este idempotent, adică puteți trimite aceeași solicitare de mai multe ori și o singură acțiune va fi efectuată. Acest lucru este diferit de POST, pentru că dacă am trimis noua noastră solicitare de utilizator de mai multe ori, ea va continua să creeze noi utilizatori.

Pentru API-ul nostru, vom înființa A PUNE pentru a putea gestiona editarea unui singur utilizator, deci vom folosi : id parametru de traseu de această dată.

Să creăm un ACTUALIZAȚI interogați și asigurați-vă că se aplică numai ID-ului solicitat cu UNDE clauză. Folosim două ? placeholders, iar valorile pe care le vom trece vor merge în ordine succesivă.

// Actualizați o aplicație de utilizator existentă ('/ users /: id', (cerere, răspuns) => const id = request.params.id; pool.query ('UPDATE users SET? WHERE id = [request.body, id], (eroare, rezultat) => if (eroare) aruncă eroare; answer.send ("Utilizatorul a fost actualizat cu succes."););); 

Pentru testul nostru, vom edita utilizatorul 2 și actualizați adresa de e-mail de la [email protected] la [email protected]. Putem folosi din nou cURL, cu [-X (-request)] pentru a specifica în mod explicit că trimitem o solicitare PUT prin.

curl -X PUT -d "nume = Bertram Gilfoyle" -d "[email protected]" http: // localhost: 3002 / users / 2 

Asigurați-vă că reporniți serverul înainte de a trimite cererea, altfel veți primi Nu pot PUT / utilizatori / 2 eroare.

Ar trebui să vedeți acest lucru:

Utilizatorul a fost actualizat cu succes. 

Datele de utilizator cu id 2 ar trebui actualizate acum.

Trimiterea unei solicitări DELETE

Ultima noastră sarcină de a finaliza funcționalitatea CRUD a API este de a face o opțiune pentru ștergerea unui utilizator din baza de date. Această solicitare va utiliza ȘTERGE Interogare SQL cu UNDE, și va șterge un utilizator individual specificat de un parametru al traseului.

// Ștergeți un utilizator app.delete ('/ users /: id', (cerere, răspuns) => const id = request.params.id; pool.query ('DELETE FROM users WHERE id =?' (eroare, rezultat) => if (eroare) aruncă eroare; answer.send ("Utilizatorul a fost șters"););); 

Putem folosi -X din nou cu cURL pentru a trimite ștergerea prin. Să ștergem ultimul utilizator pe care l-am creat.

curl -X DELETE http: // localhost: 3002 / utilizatori / 3 

Veți vedea mesajul de succes.

Utilizatorul a fost șters. 

Navigheaza catre http: // localhost: 3002, și veți vedea că există doar doi utilizatori acum.

Felicitări! În acest moment, API-ul este complet. Vizitați repo GitHub pentru a vedea codul complet pentru routes.js.

Trimiterea cererilor prin cerere Modul

La începutul acestui articol, am instalat patru dependențe, iar una dintre ele a fost cerere modul. În loc să utilizați cererile cURL, puteți crea un fișier nou cu toate datele și trimiteți-l. Voi crea un fișier numit post.js care va crea un nou utilizator prin POST.

const request = solicită ('request'); const json = "nume": "Dinesh Chugtai", "email": "[email protected]",; request.post (url: 'http: // localhost: 3002 / users', corp: json, json: true, funcția (eroare, răspuns, corp) console.log (corp);); 

Putem numi asta folosind nod post.js într-o nouă fereastră de terminal în timp ce serverul se execută și va avea același efect ca și utilizarea cURL. Dacă ceva nu funcționează cu cURL, cerere modulul este util, deoarece putem vedea eroarea, răspunsul și corpul.

Trimiterea cererilor prin intermediul unui formular web

De obicei, POST și alte metode HTTP care modifică starea serverului sunt trimise utilizând formularele HTML. În acest exemplu foarte simplu, putem crea un index.html fișier oriunde și faceți un câmp pentru un nume și o adresă de e-mail. Acțiunea din formular va indica în acest caz resursa http // localhost: 3002 / utilizatori, și vom specifica metoda ca post.

Crea index.html și adăugați următorul cod:

     Node.js Express REST API   

Deschideți acest fișier HTML static în browser, completați-l și trimiteți-l în timp ce serverul rulează în terminal. Ar trebui să vezi răspunsul lui Utilizatorul a adăugat codul ID: 4, și ar trebui să puteți vedea noua listă de utilizatori.

Concluzie

În acest tutorial, am învățat cum să conectăm un server Express la o bază de date MySQL și să configuram rute care să corespundă OBȚINE, POST, A PUNE, și ȘTERGE metode pentru căi și parametri dinamici ai traseului. De asemenea, am învățat cum să trimitem cereri HTTP către un server API folosind cURL, Node.js cerere modul și formularele HTML.

În acest moment, ar trebui să înțelegeți foarte bine modul în care funcționează API-urile RESTful și acum puteți crea propriul API complet în Node.js cu Express și MySQL!

Cod