Codifica la tua prima API con Node.js ed Express collega un database

Creare un'API REST con Node.js e Express: connessione di un database

Nel primo tutorial, Comprendere le API RESTful, abbiamo appreso quale sia l'architettura REST, quali sono i metodi e le risposte delle richieste HTTP e come comprendere un endpoint RESTful dell'API. Nel secondo tutorial, Come configurare un server API Express, abbiamo appreso come creare server con il built-in di entrambi i nodi http modulo e il framework Express e come instradare l'app che abbiamo creato a diversi endpoint di URL.

Al momento, stiamo utilizzando dati statici per visualizzare le informazioni dell'utente sotto forma di un feed JSON quando l'endpoint dell'API viene colpito con a OTTENERE richiesta. In questo tutorial, creeremo un database MySQL per archiviare tutti i dati, connetterci al database dalla nostra app Node.js e consentire all'API di utilizzare il OTTENERE, INVIARE, METTERE, e ELIMINA metodi per creare un'API completa.

Installazione

Fino a questo punto, non abbiamo utilizzato un database per archiviare o manipolare alcun dato, quindi ne imposteremo uno. Questo tutorial utilizzerà MySQL e, se hai già installato MySQL sul tuo computer, sarai pronto per passare al prossimo passaggio.

Se MySQL non è installato, è possibile scaricare MAMP per macOS e Windows, che fornisce un ambiente server e database gratuito. Una volta scaricato, apri il programma e fai clic Avvia server per avviare MySQL.

Oltre a configurare MySQL, vorremmo che il software della GUI visualizzasse il database e le tabelle. Per Mac, scaricare SequelPro, e per Windows scaricare SQLyog. Una volta scaricato e in esecuzione MySQL, è possibile utilizzare SequelPro o SQLyog per connettersi localhost con il nome utente radice e password radice in porto 3306.

Una volta che tutto è impostato qui, possiamo passare alla configurazione del database per la nostra API.

Impostazione del database

Nel tuo software di visualizzazione del database, aggiungi un nuovo database e chiamalo api. Assicurati che MySQL sia in esecuzione o non ti sarà possibile connettersi localhost.

Quando hai il api database creato, spostati in esso ed esegui la seguente query per creare una nuova tabella.

CREATE TABLE 'users' ('id' int (11) non firmato NOT NULL AUTO_INCREMENT, 'name' varchar (30) DEFAULT ", 'email' varchar (50) DEFAULT", PRIMARY KEY ('id')) ENGINE = InnoDB DEFAULT CHARSET = utf8; 

Questa query SQL creerà la struttura del nostro utenti tavolo. Ogni utente avrà un ID autoincrementante, un nome e un indirizzo email.

Possiamo anche riempire il database con gli stessi dati che stiamo attualmente visualizzando attraverso un array JSON statico eseguendo un INSERIRE domanda.

INSERISCI NEGLI UTENTI (nome, email) VALORI ('Richard Hendricks', '[email protected]'), ('Bertram Gilfoyle', '[email protected]'); 

Non è necessario inserire il id campo, in quanto è auto-incrementante. A questo punto, abbiamo la struttura della nostra tabella e alcuni dati di esempio con cui lavorare.

Connessione a MySQL

Di nuovo nella nostra app, dobbiamo connetterci a MySQL da Node.js per iniziare a lavorare con i dati. In precedenza, abbiamo installato il mysql modulo npm, e ora lo useremo.

Crea una nuova directory chiamata dati e fare un config.js file.

Inizieremo richiedendo il mysql modulo in dati / config.js.

const mysql = require ('mysql'); 

Creiamo a config oggetto che contiene l'host, l'utente, la password e il database. Questo dovrebbe riferirsi al api database che abbiamo creato e utilizzare le impostazioni di localhost predefinite.

// Imposta credenziali di connessione al database const config = host: 'localhost', utente: 'root', password: 'root', database: 'api',; 

Per efficienza, creeremo un pool MySQL, che ci consentirà di utilizzare più connessioni contemporaneamente anziché dover aprire e chiudere manualmente più connessioni.

// Crea un pool di pool MySQL = mysql.createPool (config); 

Infine, esporteremo il pool MySQL in modo che l'app possa utilizzarlo.

// Esporta il pool module.exports = pool; 

Puoi vedere il file di configurazione del database completato nel nostro repository GitHub.

Ora che ci colleghiamo a MySQL e le nostre impostazioni sono complete, possiamo passare all'interazione con il database dall'API.

Ottenere dati API da MySQL

Attualmente, il nostro routes.js il file sta creando manualmente un array JSON di utenti, che assomiglia a questo.

const users = [... 

Poiché non utilizzeremo più dati statici, possiamo eliminare l'intero array e sostituirlo con un collegamento al nostro pool MySQL.

// Carica la connessione al pool MySQL const pool = require ('... / data / config'); 

In precedenza, il OTTENERE per il / utenti il percorso stava inviando la statica utenti dati. Il nostro codice aggiornato cercherà invece il database per quei dati. Utilizzeremo una query SQL per SELEZIONARE tutto dal utenti tavolo, che assomiglia a questo.

SELEZIONA * DA utenti 

Ecco cosa è il nostro nuovo / utenti ottenere il percorso sarà simile, utilizzando il pool.query () metodo.

// Visualizza tutti gli utenti app.get ('/ users', (request, response) => pool.query ('SELECT * FROM users', (error, result) => if (errore) errore di lancio; risposta. invia (risultato););); 

Qui, stiamo eseguendo il SELEZIONARE interrogare e quindi inviare il risultato come JSON al client tramite il / utenti endpoint. Se si riavvia il server e si passa a / utenti pagina, vedrai gli stessi dati di prima, ma ora è dinamico.

Utilizzo dei parametri URL

Finora, i nostri endpoint sono stati percorsi statici, o il / radice o / utenti-ma che dire quando vogliamo vedere i dati solo su un utente specifico? Dovremo utilizzare un endpoint variabile.

Per i nostri utenti, potremmo voler recuperare informazioni su ogni singolo utente in base al suo ID univoco. Per farlo, useremmo due punti (:) per indicare che si tratta di un parametro del percorso.

// Visualizza un singolo utente per ID app.get ('/ users /: id', (request, response) => ...); ); 

Possiamo recuperare il parametro per questo percorso con request.params proprietà. Dal momento che il nostro è chiamato id, sarà così che ci riferiamo ad esso.

const id = request.params.id; 

Ora aggiungeremo un DOVE clausola al nostro SELEZIONARE dichiarazione per ottenere solo i risultati che hanno specificato id.

Useremo ? come segnaposto per evitare l'iniezione SQL e passare l'id attraverso come parametro, invece di costruire una stringa concatenata, che sarebbe meno sicura.

pool.query ('SELECT * FROM users WHERE id =?', id, (error, result) => if (errore) errore di lancio; response.send (risultato);); 

Il codice completo per la nostra singola risorsa utente ora appare così:

// Visualizza un singolo utente per ID app.get ('/ users /: id', (request, response) => const id = request.params.id; pool.query ('SELECT * FROM users WHERE id =? ', id, (error, result) => if (errore) errore di lancio; response.send (risultato););); 

Ora puoi riavviare il server e navigare http: // localhost / utenti / 2 per vedere solo le informazioni per Gilfoyle. Se ricevi un errore come Impossibile ottenere / utenti / 2, significa che devi riavviare il server.

Andando a questo URL dovrebbe restituire un singolo risultato.

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

Se è quello che vedi, congratulazioni: hai impostato con successo un parametro di percorso dinamico!

Invio di una richiesta POST

Finora, tutto ciò che abbiamo fatto ha usato OTTENERE richieste. Queste richieste sono sicure, nel senso che non alterano lo stato del server. Abbiamo semplicemente visto i dati JSON.

Ora inizieremo a rendere l'API veramente dinamica utilizzando a INVIARE richiesta di aggiungere nuovi dati.

Ho accennato in precedenza all'articolo Understanding REST che non usiamo verbi come Inserisci o Elimina nell'URL per eseguire azioni. Per aggiungere un nuovo utente al database, lo faremo INVIARE allo stesso URL da cui li vediamo, ma semplicemente impostiamo un percorso separato per esso.

// Aggiungi un nuovo utente app.post ('/ users', (request, response) => ...); 

Nota che stiamo usando app.post () invece di app.get () adesso.

Dal momento che stiamo creando anziché leggere, useremo un INSERIRE interrogare qui, proprio come abbiamo fatto all'inizializzazione del database. Invieremo l'intero request.body attraverso la query SQL.

pool.query ('INSERT INTO users SET?', request.body, (error, result) => if (errore) errore di lancio; 

Specificheremo anche lo stato della risposta come 201, che sta per Creato. Per ottenere l'ID dell'ultimo elemento inserito, useremo il insertId proprietà.

response.status (201) .send ('Utente aggiunto con ID: $ result.insertId'); 

Il nostro intero INVIARE ricevere il codice sarà simile a questo.

// Aggiungi un nuovo utente app.post ('/ users', (request, response) => pool.query ('INSERT INTO users SET?', Request.body, (error, result) => if (errore ) throw error; response.status (201) .send ('Utente aggiunto con ID: $ result.insertId'););); 

Ora possiamo inviare un INVIARE richiesta attraverso. La maggior parte delle volte quando invii un INVIARE richiesta, lo stai facendo attraverso un modulo web. Impareremo come impostarlo alla fine di questo articolo, ma il modo più semplice e veloce per inviare un test INVIARE è con cURL, usando il -d (- data) bandiera.

Correremo arricciatura -d, seguito da una stringa di query contenente tutte le coppie chiave / valore e l'endpoint della richiesta.

curl -d "name = Dinesh [email protected]" http: // localhost: 3002 / users 

Una volta inviata questa richiesta, dovresti ricevere una risposta dal server.

Utente aggiunto con ID: 3 

Se navighi http: // localhost / utenti, vedrai l'ultima voce aggiunta alla lista.

Invio di una richiesta PUT

INVIARE è utile per aggiungere un nuovo utente, ma vorremmo usarlo METTERE per modificare un utente esistente. METTERE è idempotente, nel senso che è possibile inviare la stessa richiesta più volte e verrà eseguita solo un'azione. Questo è diverso da INVIARE, perché se avessimo inviato la nostra nuova richiesta utente per più di una volta, continuerebbe a creare nuovi utenti.

Per la nostra API, stiamo per iniziare METTERE essere in grado di gestire la modifica di un singolo utente, quindi useremo il : id parametro di rotta questa volta.

Creiamo un AGGIORNARE interrogare e accertarsi che si applichi solo all'ID richiesto con DOVE clausola. Ne stiamo usando due ? segnaposto e i valori che passeremo andranno in ordine sequenziale.

// Aggiorna un utente esistente app.put ('/ users /: id', (request, response) => const id = request.params.id; pool.query ('UPDATE users SET? WHERE id =?', [request.body, id], (error, result) => if (error) throw error; response.send ('Utente aggiornato correttamente.'););); 

Per il nostro test, modificheremo l'utente 2 e aggiorna l'indirizzo email da [email protected] a [email protected]. Possiamo usare di nuovo cURL, con il [-X (--request)] flag, per specificare esplicitamente che stiamo inviando una richiesta PUT attraverso.

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

Assicurati di riavviare il server prima di inviare la richiesta, altrimenti otterrai il Can not PUT / users / 2 errore.

Dovresti vedere questo:

Utente aggiornato correttamente. 

I dati utente con id 2 dovrebbe ora essere aggiornato.

Invio di una richiesta DELETE

La nostra ultima operazione per completare la funzionalità CRUD dell'API consiste nel creare un'opzione per l'eliminazione di un utente dal database. Questa richiesta utilizzerà il ELIMINA Query SQL con DOVE, e cancellerà un singolo utente specificato da un parametro di percorso.

// Elimina un utente app.delete ('/ users /: id', (request, response) => const id = request.params.id; pool.query ('ELIMINA DAGLI utenti WHERE id =?', Id, (error, result) => if (error) throw error; response.send ('Utente eliminato.'););); 

Possiamo usare -X di nuovo con cURL per inviare l'eliminazione tramite. Eliminiamo l'ultimo utente che abbiamo creato.

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

Vedrai il messaggio di successo.

Utente eliminato. 

Navigare verso http: // localhost: 3002, e vedrai che ora ci sono solo due utenti.

Congratulazioni! A questo punto, l'API è completa. Visita il repository GitHub per vedere il codice completo per routes.js.

Invio di richieste tramite il richiesta Modulo

All'inizio di questo articolo, abbiamo installato quattro dipendenze e una di queste era la richiesta modulo. Invece di utilizzare le richieste CURL, puoi creare un nuovo file con tutti i dati e inviarlo. Creerò un file chiamato post.js che creerà un nuovo utente tramite INVIARE.

const request = require ('richiesta'); const json = "name": "Dinesh Chugtai", "email": "[email protected]",; request.post (url: 'http: // localhost: 3002 / users', corpo: json, json: true,, function (error, response, body) console.log (body);); 

Possiamo chiamare questo usando nodo post.js in una nuova finestra di terminale mentre il server è in esecuzione e avrà lo stesso effetto dell'uso di cURL. Se qualcosa non funziona con cURL, il richiesta il modulo è utile in quanto possiamo visualizzare l'errore, la risposta e il corpo.

Invio di richieste tramite un modulo Web

Generalmente, INVIARE e altri metodi HTTP che alterano lo stato del server vengono inviati utilizzando i moduli HTML. In questo esempio molto semplice, possiamo creare un index.html file ovunque, e creare un campo per un nome e un indirizzo e-mail. L'azione del modulo punta alla risorsa, in questo caso http // localhost: 3002 / utenti, e specificheremo il metodo come inviare.

Creare index.html e aggiungere il seguente codice ad esso:

     API REST Node.js Express   

Aprire questo file HTML statico nel browser, compilarlo e inviarlo mentre il server è in esecuzione nel terminale. Dovresti vedere la risposta di Utente aggiunto con ID: 4, e dovresti essere in grado di visualizzare il nuovo elenco di utenti.

Conclusione

In questo tutorial, abbiamo imparato come collegare un server Express a un database MySQL e impostare percorsi corrispondenti a OTTENERE, INVIARE, METTERE, e ELIMINA metodi per percorsi e parametri di percorso dinamici. Abbiamo anche imparato come inviare richieste HTTP a un server API utilizzando cURL, il Node.js richiesta modulo e moduli HTML.

A questo punto, dovresti avere una buona conoscenza di come funzionano le API RESTful e ora puoi creare la tua API completa in Node.js con Express e MySQL!