Mysql
 sql >> база данни >  >> RDS >> Mysql

Кодирайте първия си API с Node.js и Express:Свържете база данни

Създайте REST API с Node.js и Express:Свързване на база данни

В първия урок, Разбиране на RESTful APIs, научихме какво представлява REST архитектурата, какви са HTTP методите и отговорите на заявка и как да разберем крайната точка на RESTful API. Във втория урок, Как да настроим Express API сървър, научихме как да изграждаме сървъри с вградения http и двата Node модул и рамката Express и как да насочим създаденото от нас приложение към различни крайни точки на URL.

Понастоящем използваме статични данни за показване на потребителска информация под формата на JSON емисия, когато крайната точка на API е ударена с GET искане. В този урок ще настроим база данни MySQL, за да съхраняваме всички данни, да се свържем с базата данни от нашето приложение Node.js и ще позволим на API да използва GET , POST , PUT и DELETE методи за създаване на пълен API.

Инсталиране

До този момент не сме използвали база данни за съхраняване или манипулиране на данни, така че ще настроим такава. Този урок ще използва MySQL и ако вече имате инсталиран MySQL на вашия компютър, ще сте готови да преминете към следващата стъпка.

Ако нямате инсталиран MySQL, можете да изтеглите MAMP за macOS и Windows, който предоставя безплатна локална сървърна среда и база данни. След като го изтеглите, отворете програмата и щракнете върху Стартиране на сървъри за да стартирате MySQL.

В допълнение към настройката на самия MySQL, ние ще искаме GUI софтуер за преглед на базата данни и таблиците. За Mac изтеглете SequelPro, а за Windows изтеглете SQLyog. След като изтеглите и стартирате MySQL, можете да използвате SequelPro или SQLyog, за да се свържете с localhost с потребителско име root и парола root на порт 3306 .

След като всичко е настроено тук, можем да преминем към настройка на базата данни за нашия API.

Настройване на базата данни

Във вашия софтуер за преглед на база данни добавете нова база данни и я наречете api . Уверете се, че MySQL работи, или няма да можете да се свържете с localhost .

Когато имате api създадена база данни, преместете се в нея и изпълнете следната заявка, за да създадете нова таблица.

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;

Тази SQL заявка ще създаде структурата на нашите users маса. Всеки потребител ще има автоматично увеличаващ се идентификатор, име и имейл адрес.

Можем също да попълним базата данни със същите данни, които в момента показваме чрез статичен JSON масив, като изпълним INSERT заявка.

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

Не е необходимо да въвеждате id поле, тъй като се увеличава автоматично. В този момент имаме структурата на нашата таблица, както и някои примерни данни, с които да работим.

Свързване с MySQL

Обратно в нашето приложение, трябва да се свържем с MySQL от Node.js, за да започнем да работим с данните. По-рано инсталирахме mysql npm модул и сега ще го използваме.

Създайте нова директория, наречена data и направете config.js файл.

Ще започнем с изискването на mysql модул в data/config.js .

const mysql = require('mysql');

Нека създадем config обект, който съдържа хост, потребител, парола и база данни. Това трябва да се отнася до api база данни, която направихме, и използваме настройките по подразбиране на локалния хост.

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

За ефективност ще създадем MySQL пул, който ни позволява да използваме множество връзки наведнъж, вместо да се налага ръчно да отваряме и затваряме множество връзки.

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

Накрая ще експортираме MySQL пула, за да може приложението да го използва.

// Export the pool
module.exports = pool;

Можете да видите завършения конфигурационен файл на базата данни в нашето репозиторство на GitHub.

Сега, когато се свързваме с MySQL и нашите настройки са завършени, можем да преминем към взаимодействие с базата данни от API.

Получаване на API данни от MySQL

В момента нашият routes.js файл създава ръчно JSON масив от потребители, който изглежда така.

const users = [{ ...

Тъй като вече няма да използваме статични данни, можем да изтрием целия този масив и да го заменим с връзка към нашия MySQL пул.

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

Преди това GET за /users пътя изпращаше статичните users данни. Нашият актуализиран код вместо това ще потърси тези данни в базата данни. Ще използваме SQL заявка за SELECT всички от users таблица, която изглежда така.

SELECT * FROM users

Ето какво е нашият нов /users get route ще изглежда така, като използвате pool.query() метод.

// Display all users
app.get('/users', (request, response) => {
    pool.query('SELECT * FROM users', (error, result) => {
        if (error) throw error;

        response.send(result);
    });
});

Тук изпълняваме SELECT заявка и след това изпращане на резултата като JSON на клиента чрез /users крайна точка. Ако рестартирате сървъра и отидете до /users страница, ще видите същите данни като преди, но сега е динамична.

Използване на URL параметри

Досега нашите крайни точки са били статични пътища – или / root или /users — но какво да кажем, когато искаме да видим данни само за конкретен потребител? Ще трябва да използваме променлива крайна точка.

За нашите потребители може да искаме да извлечем информация за всеки отделен потребител въз основа на неговия уникален идентификационен номер. За да направим това, ще използваме двоеточие (: ), за да обозначи, че това е параметър на маршрута.

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

Можем да извлечем параметъра за този път с request.params Имот. Тъй като нашето се казва id , така ще го наричаме.

const id = request.params.id;

Сега ще добавим WHERE клауза към нашия SELECT изявление, за да получите само резултати, които имат посочения id .

Ще използваме ? като заместител, за да избегнете SQL инжекцията и да прехвърлите идентификатора като параметър, вместо да изграждате конкатениран низ, което би било по-малко сигурно.

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

    response.send(result);
});

Пълният код за нашия индивидуален потребителски ресурс сега изглежда така:

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

Сега можете да рестартирате сървъра и да отидете до https://localhost/users/2 за да видите само информацията за Gilfoyle. Ако получите грешка като Cannot GET /users/2 , това означава, че трябва да рестартирате сървъра.

Отиването на този URL трябва да върне единичен резултат.

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

Ако виждате това, поздравления:успешно настроихте параметър за динамичен маршрут!

Изпращане на POST заявка

Досега всичко, което сме правили, използва GET искания. Тези заявки са безопасни, което означава, че не променят състоянието на сървъра. Ние просто преглеждаме JSON данни.

Сега ще започнем да правим API наистина динамичен, като използваме POST заявка за добавяне на нови данни.

Споменах по-рано в статията Разбиране на REST, че не използваме глаголи като add или delete в URL адреса за извършване на действия. За да добавим нов потребител към базата данни, ще POST към същия URL адрес, от който ги разглеждаме, но просто задайте отделен маршрут за него.

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

Имайте предвид, че използваме app.post() вместо app.get() сега.

Тъй като създаваме вместо да четем, ще използваме INSERT заявка тук, подобно на това, което направихме при инициализацията на базата данни. Ще изпратим целия request.body до SQL заявката.

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

Също така ще посочим състоянието на отговора като 201 , което означава Created . За да получим идентификатора на последния вмъкнат елемент, ще използваме insertId собственост.

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

Цялата ни POST получаване на код ще изглежда така.

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

Сега можем да изпратим POST заявка чрез. През повечето време, когато изпращате POST заявка, вие го правите чрез уеб формуляр. Ще научим как да го настроим до края на тази статия, но най-бързият и лесен начин да изпратите тест POST е с cURL, като се използва -d (--data) флаг.

Ще изпълним curl -d , последвано от низ на заявка, съдържащ всички двойки ключ/стойност и крайната точка на заявката.

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

След като изпратите тази заявка, трябва да получите отговор от сървъра.

User added with ID: 3

Ако отидете до http://localhost/users , ще видите последния запис, добавен към списъка.

Изпращане на заявка PUT

POST е полезно за добавяне на нов потребител, но ще искаме да използваме PUT за промяна на съществуващ потребител. PUT е идемпотентно, което означава, че можете да изпратите една и съща заявка няколко пъти и ще бъде извършено само едно действие. Това е различно от POST , защото ако изпратим заявката си за нов потребител повече от веднъж, тя ще продължи да създава нови потребители.

За нашия API ще настроим PUT за да можем да се справим с редактирането на един потребител, така че ще използваме :id параметър на маршрута този път.

Нека създадем UPDATE заявка и се уверете, че се отнася само за искания идентификатор с WHERE клауза. Използваме два ? заместители, а стойностите, които предаваме, ще бъдат в последователен ред.

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

За нашия тест ще редактираме потребителя 2 и актуализирайте имейл адреса от [email protected] до [email protected]. Можем да използваме cURL отново с [-X (--request)] флаг, за да посочите изрично, че изпращаме PUT заявка чрез.

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

Уверете се, че рестартирате сървъра, преди да изпратите заявката, в противен случай ще получите Cannot PUT /users/2 грешка.

Трябва да видите това:

User updated successfully.

Потребителските данни с идентификатор 2 сега трябва да се актуализира.

Изпращане на заявка за ИЗТРИВАНЕ

Последната ни задача да завършим CRUD функционалността на API е да направим опция за изтриване на потребител от базата данни. Тази заявка ще използва DELETE SQL заявка с WHERE и ще изтрие отделен потребител, посочен от параметър на маршрута.

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

Можем да използваме -X отново с cURL, за да изпратите изтриването. Нека изтрием последния потребител, който създадохме.

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

Ще видите съобщението за успех.

User deleted.

Отидете до http://localhost:3002 , и ще видите, че сега има само двама потребители.

Честито! На този етап API е завършен. Посетете репозиторията на GitHub, за да видите пълния код за routes.js .

Изпращане на заявки чрез request Модул

В началото на тази статия инсталирахме четири зависимости и една от тях беше request модул. Вместо да използвате cURL заявки, можете да създадете нов файл с всички данни и да го изпратите. Ще създам файл, наречен post.js което ще създаде нов потребител чрез 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);
});

Можем да наречем това с помощта на node post.js в нов прозорец на терминала, докато сървърът работи, и това ще има същия ефект като използването на cURL. Ако нещо не работи с cURL, request модулът е полезен, тъй като можем да видим грешката, отговора и тялото.

Изпращане на заявки чрез уеб формуляр

Обикновено POST и други HTTP методи, които променят състоянието на сървъра, се изпращат с помощта на HTML форми. В този много прост пример можем да създадем index.html файл навсякъде и направете поле за име и имейл адрес. Действието на формуляра ще сочи към ресурса, в този случай http//localhost:3002/users , и ще посочим метода като post .

Създайте index.html и добавете следния код към него:

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

Отворете този статичен HTML файл във вашия браузър, попълнете го и го изпратете, докато сървърът работи в терминала. Трябва да видите отговора на User added with ID: 4 , и би трябвало да можете да видите новия списък с потребители.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да форматирате числа със запетаи в MySQL

  2. mysql като повишаване на производителността

  3. Вмъкване в няколко таблици в една заявка

  4. Вмъкване на данни в MySQL база данни

  5. MySQL Trigger за предотвратяване на INSERT при определени условия