Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Zakoduj swój pierwszy interfejs API za pomocą Node.js i Express:połącz bazę danych

Zbuduj interfejs API REST za pomocą Node.js i Express:łączenie bazy danych

W pierwszym samouczku, Understanding RESTful APIs, dowiedzieliśmy się, czym jest architektura REST, jakie są metody i odpowiedzi żądań HTTP oraz jak zrozumieć punkt końcowy RESTful API. W drugim samouczku, Jak skonfigurować serwer Express API, dowiedzieliśmy się, jak budować serwery z wbudowanymi w obu węzłach http moduł i framework Express oraz jak kierować utworzoną przez nas aplikację do różnych punktów końcowych adresów URL.

Obecnie używamy danych statycznych do wyświetlania informacji o użytkowniku w postaci kanału JSON, gdy punkt końcowy API zostanie trafiony za pomocą GET wniosek. W tym samouczku skonfigurujemy bazę danych MySQL do przechowywania wszystkich danych, połączymy się z bazą danych z naszej aplikacji Node.js i zezwolimy API na użycie GET , POST , PUT i DELETE metody tworzenia kompletnego interfejsu API.

Instalacja

Do tego momentu nie używaliśmy bazy danych do przechowywania lub manipulowania danymi, więc zamierzamy ją skonfigurować. W tym samouczku będzie używany MySQL, a jeśli masz już zainstalowany MySQL na swoim komputerze, możesz przejść do następnego kroku.

Jeśli nie masz zainstalowanego MySQL, możesz pobrać MAMP dla macOS i Windows, który zapewnia bezpłatne, lokalne środowisko serwera i bazę danych. Po pobraniu otwórz program i kliknij Uruchom serwery uruchomić MySQL.

Oprócz konfiguracji samego MySQL, będziemy chcieli, aby oprogramowanie GUI wyświetlało bazę danych i tabele. W przypadku komputerów Mac pobierz SequelPro, a w przypadku systemu Windows pobierz SQLyog. Po pobraniu i uruchomieniu MySQL możesz użyć SequelPro lub SQLyog, aby połączyć się z localhost z nazwą użytkownika root i hasło root na porcie 3306 .

Po skonfigurowaniu wszystkiego tutaj możemy przejść do konfiguracji bazy danych dla naszego API.

Konfiguracja bazy danych

W oprogramowaniu do przeglądania bazy danych dodaj nową bazę danych i nazwij ją api . Upewnij się, że MySQL działa, w przeciwnym razie nie będziesz mógł połączyć się z localhost .

Gdy masz api utworzono bazę danych, przejdź do niej i uruchom następujące zapytanie, aby utworzyć nową tabelę.

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;

To zapytanie SQL utworzy strukturę naszych users stół. Każdy użytkownik będzie miał automatycznie zwiększający się identyfikator, imię i adres e-mail.

Możemy również wypełnić bazę danych tymi samymi danymi, które obecnie wyświetlamy za pomocą statycznej tablicy JSON, uruchamiając INSERT zapytanie.

INSERT INTO users (name, email) 
     VALUES ('Richard Hendricks', '[email protected]'), 
            ('Bertram Gilfoyle',  '[email protected]');

Nie ma potrzeby wprowadzania id pole, ponieważ jest automatyczne zwiększanie. W tym momencie mamy strukturę naszej tabeli, a także kilka przykładowych danych do pracy.

Łączenie z MySQL

Wracając do naszej aplikacji, musimy połączyć się z MySQL z Node.js, aby rozpocząć pracę z danymi. Wcześniej zainstalowaliśmy mysql npm, a teraz będziemy go używać.

Utwórz nowy katalog o nazwie dane i utwórz config.js plik.

Zaczniemy od wymagania mysql moduł w data/config.js .

const mysql = require('mysql');

Stwórzmy config obiekt zawierający hosta, użytkownika, hasło i bazę danych. Powinno to odnosić się do api bazy danych, którą stworzyliśmy i używamy domyślnych ustawień hosta lokalnego.

// Set database connection credentials
const config = {
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'api',
};

Aby zwiększyć wydajność, stworzymy pulę MySQL, która pozwoli nam korzystać z wielu połączeń jednocześnie, zamiast ręcznie otwierać i zamykać wiele połączeń.

// Create a MySQL pool
const pool = mysql.createPool(config);

Na koniec wyeksportujemy pulę MySQL, aby aplikacja mogła z niej korzystać.

// Export the pool
module.exports = pool;

Możesz zobaczyć ukończony plik konfiguracyjny bazy danych w naszym repozytorium GitHub.

Teraz, gdy łączymy się z MySQL i nasze ustawienia są kompletne, możemy przejść do interakcji z bazą danych z poziomu API.

Pobieranie danych API z MySQL

Obecnie nasz routes.js plik ręcznie tworzy tablicę JSON użytkowników, która wygląda tak.

const users = [{ ...

Ponieważ nie będziemy już używać danych statycznych, możemy usunąć całą tablicę i zastąpić ją linkiem do naszej puli MySQL.

// Load the MySQL pool connection
const pool = require('../data/config');

Wcześniej GET dla /users path wysyłał statycznych users dane. Nasz zaktualizowany kod będzie zamiast tego wysyłał zapytanie do bazy danych o te dane. Użyjemy zapytania SQL do SELECT wszystko od users stół, który wygląda tak.

SELECT * FROM users

Oto, co nasz nowy /users get route będzie wyglądać, używając 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);
    });
});

Tutaj uruchamiamy SELECT zapytanie, a następnie wysłanie wyniku w formacie JSON do klienta przez /users punkt końcowy. Jeśli zrestartujesz serwer i przejdziesz do /users strony, zobaczysz te same dane co wcześniej, ale teraz są dynamiczne.

Korzystanie z parametrów adresu URL

Jak dotąd nasze punkty końcowe były ścieżkami statycznymi — albo / root lub /users —ale co, gdy chcemy zobaczyć dane tylko o konkretnym użytkowniku? Musimy użyć zmiennego punktu końcowego.

Dla naszych użytkowników możemy chcieć pobrać informacje o każdym indywidualnym użytkowniku na podstawie jego unikalnego identyfikatora. Aby to zrobić, użyjemy dwukropka (: ), aby zaznaczyć, że jest to parametr trasy.

// Display a single user by ID
app.get('/users/:id', (request, response) => {
        ...
    });
});

Możemy pobrać parametr dla tej ścieżki za pomocą request.params własność. Ponieważ nasz nosi nazwę id , tak będziemy się do tego odnosić.

const id = request.params.id;

Teraz dodamy WHERE klauzula do naszego SELECT instrukcja, aby uzyskać tylko wyniki, które mają określony id .

Użyjemy ? jako symbol zastępczy, aby uniknąć wstrzyknięcia SQL i przekazać identyfikator jako parametr, zamiast tworzyć połączony ciąg, co byłoby mniej bezpieczne.

pool.query('SELECT * FROM users WHERE id = ?', id, (error, result) => {
    if (error) throw error;

    response.send(result);
});

Pełny kod naszego indywidualnego zasobu użytkownika wygląda teraz tak:

// 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);
    });
});

Teraz możesz ponownie uruchomić serwer i przejść do https://localhost/users/2 aby zobaczyć tylko informacje dla Gilfoyle'a. Jeśli pojawi się błąd, taki jak Cannot GET /users/2 , oznacza to, że musisz zrestartować serwer.

Przejście do tego adresu URL powinno zwrócić pojedynczy wynik.

[{
    id: 2,
    name: "Bertram Gilfoyle",
    email: "[email protected]"
}]

Jeśli to widzisz, gratulacje:udało Ci się skonfigurować dynamiczny parametr trasy!

Wysyłanie żądania POST

Do tej pory wszystko, co robiliśmy, wykorzystywało GET upraszanie. Te żądania są bezpieczne, co oznacza, że ​​nie zmieniają stanu serwera. Po prostu przeglądaliśmy dane JSON.

Teraz zaczniemy tworzyć naprawdę dynamiczne API za pomocą POST prośba o dodanie nowych danych.

Wspomniałem wcześniej w artykule Understanding REST, że nie używamy czasowników takich jak add lub delete w adresie URL do wykonywania działań. Aby dodać nowego użytkownika do bazy danych, POST do tego samego adresu URL, z którego je przeglądamy, ale po prostu skonfiguruj dla niego osobną trasę.

// Add a new user
app.post('/users', (request, response) => {
    ...
});

Zauważ, że używamy app.post() zamiast app.get() teraz.

Ponieważ tworzymy zamiast czytać, użyjemy INSERT zapytanie tutaj, podobnie jak przy inicjalizacji bazy danych. Wyślemy całe request.body aż do zapytania SQL.

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

Zamierzamy również określić status odpowiedzi jako 201 , co oznacza Created . Aby uzyskać identyfikator ostatnio wstawionego elementu, użyjemy insertId właściwość.

response.status(201).send(`User added with ID: ${result.insertId}`);

Cały nasz POST otrzymany kod będzie wyglądał tak.

// 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}`);
    });
});

Teraz możemy wysłać POST żądanie przez. W większości przypadków, gdy wysyłasz POST żądanie, robisz to za pomocą formularza internetowego. Dowiemy się, jak to skonfigurować pod koniec tego artykułu, ale najszybszy i najłatwiejszy sposób na wysłanie testowego POST jest z cURL, używając -d (--data) flaga.

Uruchomimy curl -d , po którym następuje ciąg zapytania zawierający wszystkie pary klucz/wartość oraz punkt końcowy żądania.

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

Po wysłaniu tego żądania powinieneś otrzymać odpowiedź z serwera.

User added with ID: 3

Jeśli przejdziesz do http://localhost/users , zobaczysz najnowszy wpis dodany do listy.

Wysyłanie żądania PUT

POST jest przydatne do dodawania nowego użytkownika, ale będziemy chcieli użyć PUT aby zmodyfikować istniejącego użytkownika. PUT jest idempotentny, co oznacza, że ​​możesz wysłać to samo żądanie wiele razy i tylko jedna akcja zostanie wykonana. To różni się od POST , ponieważ gdybyśmy wysłali nasze żądanie nowego użytkownika więcej niż raz, nadal tworzylibyśmy nowych użytkowników.

Dla naszego API skonfigurujemy PUT aby móc obsłużyć edycję pojedynczego użytkownika, więc użyjemy :id tym razem parametr trasy.

Utwórzmy UPDATE zapytanie i upewnij się, że dotyczy tylko żądanego identyfikatora z WHERE klauzula. Używamy dwóch ? symbole zastępcze, a wartości, które przekazujemy, zostaną podane w kolejności sekwencyjnej.

// 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.');
    });
});

W naszym teście edytujemy użytkownika 2 i zaktualizuj adres e-mail z [email protected] na [email protected]. Możemy ponownie użyć cURL, z [-X (--request)] flagę, aby wyraźnie określić, że wysyłamy żądanie PUT.

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

Pamiętaj, aby ponownie uruchomić serwer przed wysłaniem żądania, w przeciwnym razie otrzymasz Cannot PUT /users/2 błąd.

Powinieneś zobaczyć to:

User updated successfully.

Dane użytkownika o identyfikatorze 2 powinien zostać zaktualizowany.

Wysyłanie żądania usunięcia

Ostatnim naszym zadaniem w celu uzupełnienia funkcjonalności CRUD API jest stworzenie opcji usunięcia użytkownika z bazy danych. To żądanie użyje DELETE Zapytanie SQL z WHERE , i usunie pojedynczego użytkownika określonego przez parametr 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.');
    });
});

Możemy użyć -X ponownie za pomocą cURL, aby wysłać usunięcie. Usuńmy ostatniego utworzonego użytkownika.

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

Zobaczysz komunikat o powodzeniu.

User deleted.

Przejdź do http://localhost:3002 , a zobaczysz, że teraz jest tylko dwóch użytkowników.

Gratulacje! W tym momencie interfejs API jest gotowy. Odwiedź repozytorium GitHub, aby zobaczyć pełny kod dla routes.js .

Wysyłanie żądań przez request Moduł

Na początku tego artykułu zainstalowaliśmy cztery zależności, a jedną z nich było request moduł. Zamiast używać żądań cURL, możesz utworzyć nowy plik ze wszystkimi danymi i przesłać go. Utworzę plik o nazwie post.js który utworzy nowego użytkownika przez 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);
});

Możemy to wywołać za pomocą node post.js w nowym oknie terminala, gdy serwer jest uruchomiony, i będzie to miało taki sam efekt, jak użycie cURL. Jeśli coś nie działa z cURL, request moduł jest przydatny, ponieważ możemy wyświetlić błąd, odpowiedź i treść.

Wysyłanie żądań za pośrednictwem formularza internetowego

Zwykle POST a inne metody HTTP zmieniające stan serwera są wysyłane za pomocą formularzy HTML. W tym bardzo prostym przykładzie możemy utworzyć index.html plik w dowolnym miejscu i utwórz pole na imię i nazwisko oraz adres e-mail. Akcja formularza wskaże zasób, w tym przypadku http//localhost:3002/users , a my określimy metodę jako post .

Utwórz index.html i dodaj do niego następujący kod:

<!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>

Otwórz ten statyczny plik HTML w przeglądarce, wypełnij go i wyślij, gdy serwer jest uruchomiony w terminalu. Powinieneś zobaczyć odpowiedź User added with ID: 4 i powinieneś być w stanie wyświetlić nową listę użytkowników.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak skonfigurować automatyczne przełączanie awaryjne dla bazy danych Moodle MySQL?

  2. Funkcja MySQL ACOS() — zwraca cosinus łuku liczby

  3. Jak zobaczyć indeksy dla bazy danych lub tabeli w MySQL?

  4. Django :Tabela nie istnieje

  5. Ściągawka z poleceniami SQL – jak nauczyć się SQL w 10 minut