Erstellen Sie eine REST-API mit Node.js und Express:Verbinden einer Datenbank
Im ersten Tutorial, RESTful-APIs verstehen, haben wir gelernt, was die REST-Architektur ist, welche HTTP-Anforderungsmethoden und -antworten sind und wie man einen RESTful-API-Endpunkt versteht. Im zweiten Tutorial, So richten Sie einen Express-API-Server ein, haben wir gelernt, wie Sie Server mit dem integrierten http
beider Knoten erstellen -Modul und das Express-Framework und wie die von uns erstellte App an verschiedene URL-Endpunkte weitergeleitet wird.
Derzeit verwenden wir statische Daten, um Benutzerinformationen in Form eines JSON-Feeds anzuzeigen, wenn der API-Endpunkt mit einem GET
erreicht wird Anfrage. In diesem Tutorial richten wir eine MySQL-Datenbank ein, um alle Daten zu speichern, stellen von unserer Node.js-App aus eine Verbindung zur Datenbank her und erlauben der API, GET
zu verwenden , POST
, PUT
, und DELETE
Methoden zum Erstellen einer vollständigen API.
Installation
Bis zu diesem Punkt haben wir keine Datenbank zum Speichern oder Bearbeiten von Daten verwendet, also werden wir eine einrichten. Dieses Tutorial wird MySQL verwenden, und wenn Sie MySQL bereits auf Ihrem Computer installiert haben, können Sie mit dem nächsten Schritt fortfahren.
Wenn Sie MySQL nicht installiert haben, können Sie MAMP für macOS und Windows herunterladen, das eine kostenlose, lokale Serverumgebung und Datenbank bereitstellt. Öffnen Sie nach dem Herunterladen das Programm und klicken Sie auf Server starten um MySQL zu starten.
Zusätzlich zum Einrichten von MySQL selbst möchten wir, dass die GUI-Software die Datenbank und die Tabellen anzeigt. Laden Sie für Mac SequelPro und für Windows SQLyog herunter. Sobald Sie MySQL heruntergeladen und ausgeführt haben, können Sie SequelPro oder SQLyog verwenden, um sich mit localhost
zu verbinden mit dem Benutzernamen root
und das Passwort root
auf Port 3306
.
Sobald hier alles eingerichtet ist, können wir mit dem Einrichten der Datenbank für unsere API fortfahren.
Einrichten der Datenbank
Fügen Sie in Ihrer Datenbankanzeigesoftware eine neue Datenbank hinzu und nennen Sie sie api
. Stellen Sie sicher, dass MySQL ausgeführt wird, oder Sie können sich nicht mit localhost
verbinden .
Wenn Sie die api
haben Datenbank erstellt, wechseln Sie hinein und führen Sie die folgende Abfrage aus, um eine neue Tabelle zu erstellen.
CREATE TABLE `users` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(30) DEFAULT '', `email` varchar(50) DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Diese SQL-Abfrage erstellt die Struktur unserer users
Tisch. Jeder Benutzer hat eine automatisch inkrementierende ID, einen Namen und eine E-Mail-Adresse.
Wir können die Datenbank auch mit denselben Daten füllen, die wir gerade über ein statisches JSON-Array anzeigen, indem wir ein INSERT
ausführen Abfrage.
INSERT INTO users (name, email) VALUES ('Richard Hendricks', '[email protected]'), ('Bertram Gilfoyle', '[email protected]');
Die id
muss nicht eingegeben werden Feld, da es automatisch inkrementiert wird. An diesem Punkt haben wir die Struktur unserer Tabelle sowie einige Beispieldaten, mit denen wir arbeiten können.
Verbinden mit MySQL
Zurück in unserer App müssen wir uns von Node.js aus mit MySQL verbinden, um mit den Daten zu arbeiten. Zuvor haben wir mysql
installiert npm-Modul, und jetzt werden wir es verwenden.
Erstellen Sie ein neues Verzeichnis namens data und erstellen Sie eine config.js Datei.
Wir beginnen mit der Anforderung von mysql
Modul in data/config.js .
const mysql = require('mysql');
Lassen Sie uns eine config
erstellen Objekt, das Host, Benutzer, Passwort und Datenbank enthält. Dies sollte sich auf die api
beziehen Datenbank, die wir erstellt haben, und verwenden Sie die standardmäßigen localhost-Einstellungen.
// Set database connection credentials const config = { host: 'localhost', user: 'root', password: 'root', database: 'api', };
Aus Effizienzgründen erstellen wir einen MySQL-Pool, der es uns ermöglicht, mehrere Verbindungen gleichzeitig zu verwenden, anstatt mehrere Verbindungen manuell öffnen und schließen zu müssen.
// Create a MySQL pool const pool = mysql.createPool(config);
Schließlich exportieren wir den MySQL-Pool, damit die App ihn verwenden kann.
// Export the pool module.exports = pool;
Sie können die fertige Datenbankkonfigurationsdatei in unserem GitHub-Repository einsehen.
Nachdem wir uns jetzt mit MySQL verbunden haben und unsere Einstellungen abgeschlossen sind, können wir mit der Interaktion mit der Datenbank über die API fortfahren.
API-Daten von MySQL abrufen
Aktuell unsere routes.js
Datei erstellt manuell ein JSON-Array von Benutzern, das wie folgt aussieht.
const users = [{ ...
Da wir keine statischen Daten mehr verwenden werden, können wir das gesamte Array löschen und durch einen Link zu unserem MySQL-Pool ersetzen.
// Load the MySQL pool connection const pool = require('../data/config');
Zuvor war das GET
für /users
path hat die statischen users
gesendet Daten. Unser aktualisierter Code wird stattdessen die Datenbank nach diesen Daten abfragen. Wir werden eine SQL-Abfrage für SELECT
verwenden alles von den users
Tabelle, die so aussieht.
SELECT * FROM users
Hier ist, was unsere neuen /users
get route sieht aus wie unter Verwendung von pool.query()
Methode.
// Display all users app.get('/users', (request, response) => { pool.query('SELECT * FROM users', (error, result) => { if (error) throw error; response.send(result); }); });
Hier führen wir SELECT
aus abfragen und das Ergebnis dann als JSON über /users
an den Client senden Endpunkt. Wenn Sie den Server neu starten und zu /users
navigieren Seite sehen Sie die gleichen Daten wie zuvor, aber jetzt sind sie dynamisch.
URL-Parameter verwenden
Bisher waren unsere Endpunkte statische Pfade – entweder /
root oder /users
– aber was ist, wenn wir nur Daten über einen bestimmten Benutzer sehen möchten? Wir müssen einen variablen Endpunkt verwenden.
Für unsere Benutzer möchten wir möglicherweise Informationen über jeden einzelnen Benutzer basierend auf seiner eindeutigen ID abrufen. Dazu verwenden wir einen Doppelpunkt (:
), um anzuzeigen, dass es sich um einen Routenparameter handelt.
// Display a single user by ID app.get('/users/:id', (request, response) => { ... }); });
Wir können den Parameter für diesen Pfad mit request.params
abrufen Eigentum. Denn unsere heißt id
, so werden wir es bezeichnen.
const id = request.params.id;
Jetzt fügen wir ein WHERE
hinzu -Klausel zu unserem SELECT
-Anweisung, um nur Ergebnisse zu erhalten, die die angegebene id
haben .
Wir verwenden ?
als Platzhalter, um eine SQL-Einschleusung zu vermeiden und die ID als Parameter weiterzugeben, anstatt eine verkettete Zeichenfolge zu erstellen, was weniger sicher wäre.
pool.query('SELECT * FROM users WHERE id = ?', id, (error, result) => { if (error) throw error; response.send(result); });
Der vollständige Code für unsere individuelle Benutzerressource sieht nun so aus:
// Display a single user by ID app.get('/users/:id', (request, response) => { const id = request.params.id; pool.query('SELECT * FROM users WHERE id = ?', id, (error, result) => { if (error) throw error; response.send(result); }); });
Jetzt können Sie den Server neu starten und zu https://localhost/users/2
navigieren um nur die Informationen für Gilfoyle anzuzeigen. Wenn Sie eine Fehlermeldung wie Cannot GET /users/2
erhalten , bedeutet dies, dass Sie den Server neu starten müssen.
Der Aufruf dieser URL sollte ein einzelnes Ergebnis zurückgeben.
[{ id: 2, name: "Bertram Gilfoyle", email: "[email protected]" }]
Wenn Sie das sehen, herzlichen Glückwunsch:Sie haben erfolgreich einen dynamischen Routenparameter eingerichtet!
Senden einer POST-Anfrage
Bisher haben wir bei allem, was wir getan haben, GET
verwendet Anfragen. Diese Anfragen sind sicher, was bedeutet, dass sie den Zustand des Servers nicht verändern. Wir haben uns einfach JSON-Daten angesehen.
Jetzt werden wir damit beginnen, die API wirklich dynamisch zu machen, indem wir einen POST
verwenden Anfrage zum Hinzufügen neuer Daten.
Ich habe bereits im Artikel „REST verstehen“ erwähnt, dass wir keine Verben wie add
verwenden oder delete
in der URL zum Ausführen von Aktionen. Um einen neuen Benutzer zur Datenbank hinzuzufügen, werden wir POST
zu derselben URL, von der aus wir sie anzeigen, aber richten Sie einfach eine separate Route dafür ein.
// Add a new user app.post('/users', (request, response) => { ... });
Beachten Sie, dass wir app.post()
verwenden statt app.get()
jetzt.
Da wir erstellen statt zu lesen, verwenden wir ein INSERT
Abfrage hier, ähnlich wie wir es bei der Initialisierung der Datenbank getan haben. Wir senden den gesamten request.body
bis hin zur SQL-Abfrage.
pool.query('INSERT INTO users SET ?', request.body, (error, result) => { if (error) throw error;
Außerdem geben wir den Status der Antwort als 201
an , was für Created
steht . Um die ID des zuletzt eingefügten Elements zu erhalten, verwenden wir die insertId
Eigentum.
response.status(201).send(`User added with ID: ${result.insertId}`);
Unser gesamter POST
Empfangscode sieht so aus.
// Add a new user app.post('/users', (request, response) => { pool.query('INSERT INTO users SET ?', request.body, (error, result) => { if (error) throw error; response.status(201).send(`User added with ID: ${result.insertId}`); }); });
Jetzt können wir einen POST
senden Anfrage durch. Meistens, wenn Sie einen POST
senden Anfrage, tun Sie dies über ein Webformular. Wir werden lernen, wie man das am Ende dieses Artikels einrichtet, aber der schnellste und einfachste Weg ist, einen Test-POST
zu senden ist mit cURL unter Verwendung von -d (--data)
Flagge.
Wir führen curl -d
aus , gefolgt von einer Abfragezeichenfolge, die alle Schlüssel/Wert-Paare und den Anforderungsendpunkt enthält.
curl -d "name=Dinesh Chugtai&[email protected]" http://localhost:3002/users
Sobald Sie diese Anfrage durchgeschickt haben, sollten Sie eine Antwort vom Server erhalten.
User added with ID: 3
Wenn Sie zu http://localhost/users
navigieren , sehen Sie den letzten Eintrag, der der Liste hinzugefügt wurde.
Senden einer PUT-Anfrage
POST
ist nützlich, um einen neuen Benutzer hinzuzufügen, aber wir möchten PUT
verwenden um einen bestehenden Benutzer zu ändern. PUT
ist idempotent, was bedeutet, dass Sie dieselbe Anfrage mehrmals senden können und nur eine Aktion ausgeführt wird. Dies unterscheidet sich von POST
, denn wenn wir unsere neue Benutzeranfrage mehr als einmal senden würden, würden ständig neue Benutzer erstellt.
Für unsere API richten wir PUT
ein um die Bearbeitung eines einzelnen Benutzers handhaben zu können, verwenden wir also die :id
Routenparameter diesmal.
Lassen Sie uns ein UPDATE
erstellen Abfrage und stellen Sie sicher, dass sie nur für die angeforderte ID mit dem WHERE
gilt Klausel. Wir verwenden zwei ?
Platzhalter, und die Werte, die wir übergeben, gehen in sequenzieller Reihenfolge.
// Update an existing user 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('User updated successfully.'); }); });
Für unseren Test bearbeiten wir den Benutzer 2
und aktualisieren Sie die E-Mail-Adresse von [email protected] zu [email protected]. Wir können cURL wieder verwenden, mit dem [-X (--request)]
-Flag, um explizit anzugeben, dass wir eine PUT-Anfrage durchsenden.
curl -X PUT -d "name=Bertram Gilfoyle" -d "[email protected]" http://localhost:3002/users/2
Stellen Sie sicher, dass Sie den Server neu starten, bevor Sie die Anfrage senden, sonst erhalten Sie die Meldung Cannot PUT /users/2
Fehler.
Sie sollten Folgendes sehen:
User updated successfully.
Die Benutzerdaten mit der ID 2
sollte jetzt aktualisiert werden.
Senden einer DELETE-Anfrage
Unsere letzte Aufgabe zur Vervollständigung der CRUD-Funktionalität der API besteht darin, eine Option zum Löschen eines Benutzers aus der Datenbank zu erstellen. Diese Anfrage verwendet den DELETE
SQL-Abfrage mit WHERE
, und es löscht einen einzelnen Benutzer, der durch einen Routenparameter angegeben ist.
// Delete a user app.delete('/users/:id', (request, response) => { const id = request.params.id; pool.query('DELETE FROM users WHERE id = ?', id, (error, result) => { if (error) throw error; response.send('User deleted.'); }); });
Wir können -X
verwenden erneut mit cURL, um die Löschung durchzusenden. Lassen Sie uns den zuletzt erstellten Benutzer löschen.
curl -X DELETE http://localhost:3002/users/3
Sie sehen die Erfolgsmeldung.
User deleted.
Navigieren Sie zu http://localhost:3002
, und Sie werden sehen, dass es jetzt nur noch zwei Benutzer gibt.
Herzliche Glückwünsche! An diesem Punkt ist die API vollständig. Besuchen Sie das GitHub-Repository, um den vollständigen Code für routes.js anzuzeigen .
Senden von Anfragen über request
Modul
Am Anfang dieses Artikels haben wir vier Abhängigkeiten installiert, und eine davon war request
Modul. Anstatt cURL-Anfragen zu verwenden, könnten Sie eine neue Datei mit allen Daten erstellen und durchsenden. Ich erstelle eine Datei namens post.js Dadurch wird ein neuer Benutzer über POST
erstellt .
const request = require('request'); const json = { "name": "Dinesh Chugtai", "email": "[email protected]", }; request.post({ url: 'http://localhost:3002/users', body: json, json: true, }, function (error, response, body) { console.log(body); });
Wir können dies mit node post.js
aufrufen in einem neuen Terminalfenster, während der Server läuft, und es hat den gleichen Effekt wie die Verwendung von cURL. Wenn etwas mit cURL nicht funktioniert, wird die request
Modul ist nützlich, da wir den Fehler, die Antwort und den Text anzeigen können.
Senden von Anfragen über ein Webformular
Normalerweise POST
und andere HTTP-Methoden, die den Status des Servers ändern, werden mithilfe von HTML-Formularen gesendet. In diesem sehr einfachen Beispiel können wir eine index.html erstellen irgendwo ablegen und ein Feld für einen Namen und eine E-Mail-Adresse erstellen. Die Aktion des Formulars zeigt auf die Ressource, in diesem Fall http//localhost:3002/users
, und wir geben die Methode als post
an .
Erstellen Sie index.html und fügen Sie den folgenden Code hinzu:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Node.js Express REST API</title> </head> <body> <form action="http://localhost:3002/users" method="post"> <label for="name">Name</label> <input type="text" name="name"> <label for="email">Email</label> <input type="email" name="email"> <input type="submit"> </form> </body> </html>
Öffnen Sie diese statische HTML-Datei in Ihrem Browser, füllen Sie sie aus und senden Sie sie, während der Server im Terminal läuft. Sie sollten die Antwort von User added with ID: 4
sehen , und Sie sollten in der Lage sein, die neue Nutzerliste anzuzeigen.