Създайте 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
, и би трябвало да можете да видите новия списък с потребители.