sql >> Databáze >  >> RDS >> Mysql

Kódujte své první API pomocí Node.js a Express:Připojte databázi

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ů.


  1. Když DISTINCT <> GROUP BY

  2. MySQL – podmíněná omezení cizích klíčů

  3. Přehled komprese dat v SQL Server

  4. Spojení různých zdrojů dat ve vrstvení