Vytvoření REST API pomocí Node.js a Express:Připojení databáze
V prvním kurzu Pochopení RESTful API jsme se dozvěděli, co je architektura REST, jaké jsou metody a odpovědi HTTP požadavků a jak porozumět koncovému bodu RESTful API. Ve druhém tutoriálu, Jak nastavit Express API Server, jsme se naučili, jak vytvářet servery s vestavěným http
v Node. modul a rámec Express a jak nasměrovat aplikaci, kterou jsme vytvořili, do různých koncových bodů URL.
V současné době používáme statická data k zobrazení informací o uživatelích ve formě zdroje JSON, když je koncový bod API zasažen pomocí GET
žádost. V tomto tutoriálu nastavíme databázi MySQL pro ukládání všech dat, připojíme se k databázi z naší aplikace Node.js a umožníme rozhraní API používat GET
, POST
, PUT
a DELETE
metody k vytvoření kompletního API.
Instalace
Až do tohoto okamžiku jsme nepoužívali databázi k ukládání nebo manipulaci s žádnými daty, takže ji založíme. Tento tutoriál bude používat MySQL, a pokud již máte MySQL na svém počítači nainstalované, budete připraveni přejít k dalšímu kroku.
Pokud nemáte nainstalovanou MySQL, můžete si stáhnout MAMP pro macOS a Windows, který poskytuje bezplatné lokální serverové prostředí a databázi. Po stažení spusťte program a klikněte na Spustit servery ke spuštění MySQL.
Kromě samotného nastavení MySQL budeme chtít, aby software GUI zobrazoval databázi a tabulky. Pro Mac si stáhněte SequelPro a pro Windows stáhněte SQLyog. Jakmile budete mít MySQL stažené a spuštěné, můžete se pomocí SequelPro nebo SQLyog připojit k localhost
s uživatelským jménem root
a heslo root
na portu 3306
.
Jakmile je zde vše nastaveno, můžeme přejít k nastavení databáze pro naše API.
Nastavení databáze
Ve svém softwaru pro prohlížení databáze přidejte novou databázi a nazvěte ji api
. Ujistěte se, že MySQL běží, jinak se nebudete moci připojit k localhost
.
Když máte api
vytvořena databáze, přesuňte se do ní a spusťte následující dotaz pro vytvoření nové tabulky.
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;
Tento SQL dotaz vytvoří strukturu našich users
stůl. Každý uživatel bude mít automaticky se zvyšující ID, jméno a e-mailovou adresu.
Můžeme také naplnit databázi stejnými daty, která aktuálně zobrazujeme prostřednictvím statického pole JSON spuštěním příkazu INSERT
dotaz.
INSERT INTO users (name, email) VALUES ('Richard Hendricks', '[email protected]'), ('Bertram Gilfoyle', '[email protected]');
Není třeba zadávat id
pole, protože se automaticky zvyšuje. V tomto okamžiku máme strukturu naší tabulky a také některá ukázková data, se kterými můžeme pracovat.
Připojení k MySQL
Zpět v naší aplikaci se musíme připojit k MySQL z Node.js, abychom mohli začít pracovat s daty. Již dříve jsme nainstalovali mysql
modul npm a nyní jej použijeme.
Vytvořte nový adresář s názvem data a vytvořte config.js soubor.
Začneme vyžadováním mysql
modulu v data/config.js .
const mysql = require('mysql');
Vytvořme config
objekt, který obsahuje hostitele, uživatele, heslo a databázi. To by mělo odkazovat na api
databázi, kterou jsme vytvořili, a používáme výchozí nastavení localhost.
// Set database connection credentials const config = { host: 'localhost', user: 'root', password: 'root', database: 'api', };
Pro efektivitu vytvoříme MySQL fond, který nám umožní používat více připojení najednou, místo abychom museli ručně otevírat a zavírat více připojení.
// Create a MySQL pool const pool = mysql.createPool(config);
Nakonec vyexportujeme fond MySQL, aby jej aplikace mohla používat.
// Export the pool module.exports = pool;
Dokončený konfigurační soubor databáze můžete vidět v našem úložišti GitHub.
Nyní, když se připojujeme k MySQL a máme hotová nastavení, můžeme přejít k interakci s databází z API.
Získávání dat API z MySQL
Aktuálně naše routes.js
soubor ručně vytváří pole uživatelů JSON, které vypadá takto.
const users = [{ ...
Vzhledem k tomu, že již nebudeme používat statická data, můžeme toto celé pole smazat a nahradit jej odkazem na náš fond MySQL.
// Load the MySQL pool connection const pool = require('../data/config');
Dříve GET
pro /users
cesta odesílala statické users
data. Náš aktualizovaný kód bude místo toho dotazovat databázi na tato data. K SELECT
použijeme SQL dotaz vše od users
tabulka, která vypadá takto.
SELECT * FROM users
Zde jsou naše nové /users
get route bude vypadat pomocí pool.query()
metoda.
// Display all users app.get('/users', (request, response) => { pool.query('SELECT * FROM users', (error, result) => { if (error) throw error; response.send(result); }); });
Zde spouštíme SELECT
dotaz a poté odeslání výsledku jako JSON klientovi prostřednictvím /users
koncový bod. Pokud restartujete server a přejděte do /users
na stránce, uvidíte stejná data jako dříve, ale nyní je dynamická.
Použití parametrů adresy URL
Doposud byly našimi koncovými body statické cesty – buď /
root nebo /users
—ale co když chceme vidět data pouze o konkrétním uživateli? Budeme muset použít proměnný koncový bod.
Pro naše uživatele můžeme chtít získat informace o každém jednotlivém uživateli na základě jeho jedinečného ID. K tomu bychom použili dvojtečku (:
) označující, že se jedná o parametr trasy.
// Display a single user by ID app.get('/users/:id', (request, response) => { ... }); });
Parametr pro tuto cestu můžeme získat pomocí request.params
vlastnictví. Protože naše se jmenuje id
, tak to budeme označovat.
const id = request.params.id;
Nyní přidáme WHERE
klauzule do našeho SELECT
příkaz získat pouze výsledky, které mají zadané id
.
Použijeme ?
jako zástupný symbol, aby se zabránilo vkládání SQL a předání id jako parametru, namísto vytváření zřetězeného řetězce, což by bylo méně bezpečné.
pool.query('SELECT * FROM users WHERE id = ?', id, (error, result) => { if (error) throw error; response.send(result); });
Úplný kód pro náš individuální uživatelský zdroj nyní vypadá takto:
// 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); }); });
Nyní můžete restartovat server a přejít na https://localhost/users/2
vidět pouze informace pro Gilfoyla. Pokud se zobrazí chyba jako Cannot GET /users/2
, znamená to, že musíte restartovat server.
Přechod na tuto adresu URL by měl vrátit jeden výsledek.
[{ id: 2, name: "Bertram Gilfoyle", email: "[email protected]" }]
Pokud je to to, co vidíte, gratulujeme:úspěšně jste nastavili parametr dynamické trasy!
Odeslání požadavku POST
Doposud všechno, co jsme dělali, používalo GET
žádosti. Tyto požadavky jsou bezpečné, což znamená, že nemění stav serveru. Prostě jsme si prohlíželi data JSON.
Nyní začneme vytvářet API skutečně dynamické pomocí POST
požádat o přidání nových dat.
Již dříve jsem zmínil v článku Understanding REST, že nepoužíváme slovesa jako add
nebo delete
v adrese URL pro provádění akcí. Abychom do databáze přidali nového uživatele, provedeme POST
na stejnou adresu URL, ze které je prohlížíme, ale stačí pro ni nastavit samostatnou trasu.
// Add a new user app.post('/users', (request, response) => { ... });
Všimněte si, že používáme app.post()
místo app.get()
teď.
Protože místo čtení vytváříme, použijeme INSERT
dotaz zde, podobně jako jsme to udělali při inicializaci databáze. Zašleme celý request.body
až po SQL dotaz.
pool.query('INSERT INTO users SET ?', request.body, (error, result) => { if (error) throw error;
Také uvedeme stav odpovědi jako 201
, což je zkratka pro Created
. Abychom získali ID poslední vložené položky, použijeme insertId
vlastnost.
response.status(201).send(`User added with ID: ${result.insertId}`);
Celý náš POST
přijímat kód bude vypadat takto.
// 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}`); }); });
Nyní můžeme odeslat POST
požádat prostřednictvím. Většinou, když posíláte POST
žádost, děláte to prostřednictvím webového formuláře. Jak to nastavit, se naučíme na konci tohoto článku, ale nejrychlejší a nejjednodušší způsob, jak odeslat test POST
je s cURL pomocí -d (--data)
vlajka.
Spustíme curl -d
, následovaný řetězcem dotazu obsahujícím všechny páry klíč/hodnota a koncový bod požadavku.
curl -d "name=Dinesh Chugtai&[email protected]" http://localhost:3002/users
Jakmile tento požadavek odešlete, měli byste dostat odpověď ze serveru.
User added with ID: 3
Pokud přejdete na http://localhost/users
, uvidíte poslední položku přidanou do seznamu.
Odeslání požadavku PUT
POST
je užitečné pro přidání nového uživatele, ale my budeme chtít použít PUT
upravit stávajícího uživatele. PUT
je idempotentní, což znamená, že stejný požadavek můžete poslat vícekrát a bude provedena pouze jedna akce. Toto je jiné než POST
, protože pokud bychom náš požadavek na nového uživatele poslali více než jednou, stále by se vytvářeli noví uživatelé.
Pro naše API nastavíme PUT
abychom mohli zvládnout úpravy jednoho uživatele, takže budeme používat :id
tentokrát parametr trasy.
Vytvořme UPDATE
dotaz a ujistěte se, že se vztahuje pouze na požadované id s WHERE
doložka. Používáme dva ?
zástupné symboly a hodnoty, které předáme, půjdou v sekvenčním pořadí.
// 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.'); }); });
Pro náš test upravíme uživatele 2
a aktualizujte e-mailovou adresu z [email protected] na [email protected]. Můžeme znovu použít cURL s [-X (--request)]
příznak, aby bylo výslovně uvedeno, že posíláme požadavek PUT prostřednictvím.
curl -X PUT -d "name=Bertram Gilfoyle" -d "[email protected]" http://localhost:3002/users/2
Před odesláním požadavku restartujte server, jinak se zobrazí Cannot PUT /users/2
chyba.
Měli byste vidět toto:
User updated successfully.
Uživatelská data s ID 2
by měl být nyní aktualizován.
Odeslání požadavku DELETE
Naším posledním úkolem k dokončení funkčnosti CRUD API je vytvoření možnosti pro odstranění uživatele z databáze. Tento požadavek bude používat DELETE
SQL dotaz s WHERE
a smaže jednotlivého uživatele určeného parametrem trasy.
// 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.'); }); });
Můžeme použít -X
znovu pomocí cURL pro odeslání odstranění. Smažeme posledního uživatele, kterého jsme vytvořili.
curl -X DELETE http://localhost:3002/users/3
Uvidíte zprávu o úspěchu.
User deleted.
Přejděte na http://localhost:3002
, a uvidíte, že jsou nyní pouze dva uživatelé.
Gratulujeme! V tomto okamžiku je API kompletní. Navštivte repozitář GitHubu a podívejte se na úplný kód pro routes.js .
Odesílání požadavků prostřednictvím request
Modul
Na začátku tohoto článku jsme nainstalovali čtyři závislosti a jednou z nich byl request
modul. Namísto použití požadavků cURL můžete vytvořit nový soubor se všemi daty a odeslat jej. Vytvořím soubor s názvem post.js který vytvoří nového uživatele pomocí 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); });
Můžeme to nazvat pomocí node post.js
v novém okně terminálu, zatímco server běží, a bude to mít stejný účinek jako použití cURL. Pokud něco nefunguje s cURL, request
modul je užitečný, protože můžeme zobrazit chybu, odezvu a tělo.
Odesílání požadavků prostřednictvím webového formuláře
Obvykle POST
a další metody HTTP, které mění stav serveru, jsou odesílány pomocí formulářů HTML. V tomto velmi jednoduchém příkladu můžeme vytvořit index.html soubor kdekoli a vytvořte pole pro jméno a e-mailovou adresu. Akce formuláře bude ukazovat na zdroj, v tomto případě http//localhost:3002/users
a metodu uvedeme jako post
.
Vytvořte index.html a přidejte do něj následující kód:
<!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>
Otevřete tento statický soubor HTML ve svém prohlížeči, vyplňte jej a odešlete, zatímco server běží v terminálu. Měli byste vidět odpověď User added with ID: 4
a měli byste mít možnost zobrazit nový seznam uživatelů.