In de eerste zelfstudie, RESTful API's begrijpen, hebben we geleerd wat de REST-architectuur is, welke HTTP-verzoekmethoden en -reacties er zijn en hoe een RESTful API-eindpunt te begrijpen. In de tweede zelfstudie, Hoe een Express API-server instellen, hebben we geleerd hoe we servers kunnen bouwen met de ingebouwde node van beide knooppunten http
module en het Express-framework en hoe de app die we hebben gemaakt naar verschillende URL-eindpunten te routeren.
Momenteel gebruiken we statische gegevens om gebruikersinformatie weer te geven in de vorm van een JSON-feed wanneer het API-eindpunt wordt geraakt door een KRIJGEN
verzoek. In deze zelfstudie gaan we een MySQL-database opzetten om alle gegevens op te slaan, verbinding te maken met de database vanuit onze Node.js-app en de API toe te staan de KRIJGEN
, POST
, LEGGEN
, en DELETE
methoden om een complete API te maken.
Tot nu toe hebben we geen database gebruikt om gegevens op te slaan of te manipuleren, dus we gaan er een instellen. Deze tutorial gebruikt MySQL en als je MySQL al op je computer hebt geïnstalleerd, ben je klaar om door te gaan naar de volgende stap.
Als MySQL niet is geïnstalleerd, kunt u MAMP downloaden voor macOS en Windows, dat een gratis lokale serveromgeving en database biedt. Zodra u dit hebt gedownload, opent u het programma en klikt u op Start servers om MySQL te starten.
Naast het instellen van MySQL zelf, willen we dat de GUI-software de database en tabellen bekijkt. Download voor Mac, download SequelPro en voor Windows SQLyog. Zodra u MySQL hebt gedownload en gestart, kunt u SequelPro of SQLyog gebruiken om verbinding mee te maken localhost
met de gebruikersnaam wortel
en wachtwoord wortel
op poort 3306
.
Zodra alles hier is ingesteld, kunnen we verder gaan met het instellen van de database voor onze API.
Voeg in uw databasesoftware een nieuwe database toe en noem die api
. Controleer of MySQL actief is, anders kunt u geen verbinding maken localhost
.
Wanneer u de api
database gemaakt, ga er naartoe en voer de volgende query uit om een nieuwe tabel te maken.
MAAK TABLE 'users' ('id' int (11) unsigned NOT NULL AUTO_INCREMENT, 'name' varchar (30) DEFAULT ", 'email' varchar (50) DEFAULT", PRIMARY KEY ('id')) MOTOR = InnoDB DEFAULT CHARSET = utf8;
Deze SQL-query maakt de structuur van onze gebruikers
tafel. Elke gebruiker heeft een auto-verhogende id, een naam en een e-mailadres.
We kunnen de database ook vullen met dezelfde gegevens die we momenteel weergeven via een statische JSON-array door een INSERT
vraag.
INSERT INTO gebruikers (naam, e-mailadres) VALUES ('Richard Hendricks', '[email protected]'), ('Bertram Gilfoyle', '[email protected]');
Het is niet nodig om de ID kaart
veld, omdat het automatisch wordt verhoogd. Op dit moment hebben we de structuur van onze tabel en enkele voorbeeldgegevens om mee te werken.
Terug in onze app moeten we verbinding maken met MySQL via Node.js om met de gegevens te kunnen werken. Eerder hebben we het mysql
npm-module, en nu gaan we het gebruiken.
Maak een nieuwe map met de naam gegevens en maak een Config.js het dossier.
We zullen beginnen met het vereisen van de mysql
module in data / Config.js.
const mysql = require ('mysql');
Laten we een maken config
object dat de host, gebruiker, wachtwoord en database bevat. Dit zou moeten verwijzen naar de api
database die we hebben gemaakt en gebruik de standaard localhost-instellingen.
// Stel de aanmeldingsreferenties van de database in const config = host: 'localhost', gebruiker: 'root', wachtwoord: 'root', database: 'api',;
Voor efficiëntie maken we een MySQL-pool, waarmee we meerdere verbindingen tegelijk kunnen gebruiken in plaats van dat we handmatig meerdere verbindingen moeten openen en sluiten.
// Creëer een pool poolconstant MySQL = mysql.createPool (config);
Ten slotte exporteren we de MySQL-pool zodat de app deze kan gebruiken.
// Exporteer de poolmodule.exports = pool;
U kunt het voltooide databaseconfiguratiebestand in onze GitHub-repo zien.
Nu we verbinding maken met MySQL en onze instellingen zijn voltooid, kunnen we verder gaan met de interactie met de database vanuit de API.
Momenteel is onze routes.js
bestand is het handmatig maken van een JSON-array van gebruikers, die er zo uitziet.
const gebruikers = [...
Omdat we niet langer statische gegevens gaan gebruiken, kunnen we die hele array verwijderen en vervangen door een link naar onze MySQL-pool.
// Laad de MySQL pool connection const pool = require ('... / data / config');
Eerder, de KRIJGEN
voor de / gebruikers
pad stuurde de statische gebruikers
gegevens. Onze bijgewerkte code gaat in plaats daarvan naar de database voor die gegevens zoeken. We gaan een SQL-query gebruiken voor SELECT
alles van de gebruikers
tabel, die er zo uitziet.
SELECTEER * FROM gebruikers
Dit is wat ons nieuw is / gebruikers
krijg route eruit, met behulp van de pool.query ()
methode.
// Toon alle gebruikers app.get ('/ users', (request, response) => pool.query ('SELECT * FROM users', (error, result) => if (error) throw error; response. verzend (resultaat);););
Hier hebben we de SELECT
query en vervolgens verzenden van het resultaat als JSON naar de client via de / gebruikers
eindpunt. Als u de server opnieuw start en naar de / gebruikers
pagina, zie je dezelfde gegevens als voorheen, maar nu is het dynamisch.
Tot dusverre waren onze eindpunten statische paden - ofwel de /
root of / gebruikers
-maar hoe zit het wanneer we alleen gegevens over een specifieke gebruiker willen zien? We moeten een variabel eindpunt gebruiken.
Voor onze gebruikers willen we misschien informatie over elke individuele gebruiker ophalen op basis van hun unieke ID. Om dat te doen, zouden we een dubbele punt gebruiken (:
) om aan te geven dat het een routeparameter is.
// Toon een enkele gebruiker op ID app.get ('/ users /: id', (request, response) => ...); );
We kunnen de parameter voor dit pad ophalen met de request.params
eigendom. Omdat de onze is genoemd ID kaart
, dat is hoe we ernaar verwijzen.
const id = request.params.id;
Nu voegen we een toe WAAR
clausule aan onze SELECT
verklaring om alleen resultaten te krijgen die de opgegeven hebben ID kaart
.
We zullen gebruiken ?
als tijdelijke aanduiding om SQL-injectie te voorkomen en de ID door te geven als parameter, in plaats van een aaneengesloten tekenreeks te maken, die minder veilig is.
pool.query ('SELECT * FROM gebruikers WHERE id =?', id, (error, result) => if (error) throw error; response.send (result););
De volledige code voor onze individuele gebruikersbron ziet er nu als volgt uit:
// Geef één gebruiker weer op ID app.get ('/ users /: id', (request, response) => const id = request.params.id; pool.query ('SELECT * FROM gebruikers WHERE id =? ', id, (error, result) => if (error) throw error; response.send (result);););
Nu kunt u de server opnieuw opstarten en naar navigeren http: // localhost / users / 2
om alleen de informatie voor Gilfoyle te zien. Als u een foutmelding krijgt zoals Can not GET / users / 2
, dit betekent dat u de server opnieuw moet opstarten.
Als u naar deze URL gaat, moet u één resultaat retourneren.
[id: 2, name: "Bertram Gilfoyle", e-mail: "[email protected]"]
Als dat is wat u ziet, gefeliciteerd: u hebt met succes een dynamische routeparameter ingesteld!
Tot nu toe is alles wat we hebben gedaan gebruikt KRIJGEN
verzoeken. Deze verzoeken zijn veilig, wat betekent dat ze de staat van de server niet veranderen. We hebben gewoon JSON-gegevens bekeken.
Nu gaan we beginnen om de API echt dynamisch te maken door a te gebruiken POST
verzoek om nieuwe gegevens toe te voegen.
Ik noemde eerder in het artikel REST begrijpen dat we geen werkwoorden zoals gebruiken toevoegen
of verwijderen
in de URL voor het uitvoeren van acties. Om een nieuwe gebruiker aan de database toe te voegen, zullen we dat doen POST
naar dezelfde URL waar we ze van bekijken, maar zet er gewoon een aparte route voor in.
// Voeg een nieuwe gebruiker toe app.post ('/ users', (request, response) => ...);
Merk op dat we gebruiken app.post ()
in plaats van app.get ()
nu.
Omdat we maken in plaats van lezen, gebruiken we een INSERT
query, net als bij de initialisatie van de database. We sturen het geheel request.body
tot en met de SQL-query.
pool.query ('INSERT INTO users SET?', request.body, (error, result) => if (error) throw error;
We gaan ook de status van het antwoord specificeren als 201
, wat staat voor gemaakt
. Om de id van het laatst ingevoegde item te krijgen, gebruiken we de insertId
eigendom.
response.status (201) .send ('Gebruiker toegevoegd met ID: $ result.insertId');
Ons geheel POST
ontvangstcode ziet er als volgt uit.
// Voeg een nieuwe gebruiker toe app.post ('/ users', (request, response) => pool.query ('INSERT INTO users SET?', Request.body, (error, result) => if (error ) throw error; response.status (201) .send ('Gebruiker toegevoegd met ID: $ result.insertId');););
Nu kunnen we een sturen POST
aanvraag via. Meestal wanneer u een verzendt POST
verzoek, je doet het via een webformulier. Aan het einde van dit artikel zullen we leren hoe dit moet worden ingesteld, maar de snelste en eenvoudigste manier om een test te verzenden POST
is met cURL, met behulp van de -d (- gegevens)
vlag.
We zullen rennen krullen -d
, gevolgd door een querystring die alle sleutel / waarde-paren en het verzoek-eindpunt bevat.
curl -d "name = Dinesh [email protected]" http: // localhost: 3002 / gebruikers
Nadat u dit verzoek hebt verzonden, ontvangt u een antwoord van de server.
Gebruiker toegevoegd met ID: 3
Als je navigeert naar http: // localhost / gebruikers
, je ziet het nieuwste item toegevoegd aan de lijst.
POST
is handig voor het toevoegen van een nieuwe gebruiker, maar we willen deze gebruiken LEGGEN
om een bestaande gebruiker te wijzigen. LEGGEN
is idempotent, wat betekent dat u hetzelfde verzoek meerdere keren kunt verzenden en dat slechts één actie wordt uitgevoerd. Dit is anders dan POST
, omdat als we ons nieuwe gebruikersverzoek meer dan eens zouden verzenden, het nieuwe gebruikers zou blijven maken.
Voor onze API gaan we instellen LEGGEN
om het bewerken van een enkele gebruiker te kunnen verwerken, dus we gaan de :ID kaart
routeparameter deze keer.
Laten we een maken BIJWERKEN
query en zorg ervoor dat deze alleen van toepassing is op de aangevraagde id met de WAAR
clausule. We gebruiken er twee ?
tijdelijke aanduidingen en de waarden die we doorgeven, gaan in de juiste volgorde.
// Update een bestaande user app.put ('/ users /: id', (request, response) => const id = request.params.id; pool.query ('UPDATE gebruikers SET? WHERE id =?', [request.body, id], (error, result) => if (error) throw error; response.send ('User successful updated.');););
Voor onze test zullen we de gebruiker bewerken 2
en werk het e-mailadres van [email protected] bij naar [email protected]. We kunnen opnieuw cURL gebruiken, met de [-X (- aanvraag)]
vlag, om expliciet aan te geven dat we een PUT-verzoek doorsturen.
curl -X PUT -d "naam = Bertram Gilfoyle" -d "[email protected]" http: // localhost: 3002 / users / 2
Zorg ervoor dat u de server opnieuw opstart voordat u het verzoek verzendt, anders krijgt u de Kan niet PUT / gebruikers / 2
fout.
Je zou dit moeten zien:
Gebruiker is succesvol bijgewerkt.
De gebruikersgegevens met id 2
moet nu worden bijgewerkt.
Onze laatste taak om de CRUD-functionaliteit van de API te voltooien, is om een optie te maken voor het verwijderen van een gebruiker uit de database. Dit verzoek gebruikt de DELETE
SQL-query met WAAR
, en het verwijdert een individuele gebruiker gespecificeerd door een routeparameter.
// Een gebruiker verwijderen app.delete ('/ users /: id', (request, response) => const id = request.params.id; pool.query ('DELETE FROM users WHERE id =?', Id, (fout, resultaat) => if (error) throw error; response.send ('Gebruiker verwijderd.');););
We kunnen gebruiken -X
opnieuw met cURL om de verwijdering te verzenden. Laten we de nieuwste gebruiker verwijderen die we hebben gemaakt.
curl -X DELETE http: // localhost: 3002 / users / 3
U ziet het succesbericht.
Gebruiker verwijderd.
Navigeren naar http: // localhost: 3002
, en je zult zien dat er nu maar twee gebruikers zijn.
Gefeliciteerd! Op dit punt is de API voltooid. Ga naar de GitHub-repo om de volledige code voor te bekijken routes.js.
verzoek
moduleAan het begin van dit artikel hebben we vier afhankelijkheden geïnstalleerd, en een daarvan was de verzoek
module. In plaats van cURL-aanvragen te gebruiken, kunt u een nieuw bestand maken met alle gegevens en dit doorsturen. Ik maak een bestand met de naam post.js die een nieuwe gebruiker maakt via POST
.
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););
We kunnen dit gebruiken met knoop post.js
in een nieuw terminalvenster terwijl de server actief is, en heeft hetzelfde effect als het gebruik van cURL. Als iets niet werkt met cURL, de verzoek
module is handig omdat we de fout, respons en body kunnen bekijken.
doorgaans, POST
en andere HTTP-methoden die de status van de server wijzigen, worden verzonden met HTML-formulieren. In dit zeer eenvoudige voorbeeld kunnen we een maken index.html bestand overal en maak een veld voor een naam en e-mailadres. De actie van het formulier wijst in dit geval naar de bron http // localhost: 3002 / gebruikers
, en we zullen de methode specificeren als post
.
creëren index.html en voeg de volgende code eraan toe:
Node.js Express REST API
Open dit statische HTML-bestand in uw browser, vul het in en verzend het terwijl de server in de terminal actief is. Je zou het antwoord van moeten zien Gebruiker toegevoegd met ID: 4
, en je zou in staat moeten zijn om de nieuwe lijst met gebruikers te bekijken.
In deze zelfstudie leerden we hoe we een Express-server kunnen aansluiten op een MySQL-database en routes kunnen instellen die overeenkomen met de KRIJGEN
, POST
, LEGGEN
, en DELETE
methoden voor paden en dynamische routeparameters. We hebben ook geleerd hoe HTTP-aanvragen naar een API-server kunnen worden verzonden met behulp van cURL, de Node.js verzoek
module- en HTML-formulieren.
Op dit punt moet u een goed begrip hebben van hoe RESTful API's werken en u kunt nu uw eigen volwaardige API maken in Node.js met Express en MySQL!