Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Node.js
Code

Создаем наш первый API при помощи Node.js и Express: Подключаем базу данных

by
Difficulty:BeginnerLength:LongLanguages:
This post is part of a series called Code Your First API With Node.js and Express.
Code Your First API With Node.js and Express: Set Up the Server

Russian (Pусский) translation by AlexBioJS (you can also view the original English article)

В первом руководстве этой серии, «Understanding RESTful API», мы рассмотрели, что из себя представляет архитектура REST, значение методов запроса HTTP и кодов состояния ответов и структуру конечной точки RESTful API. Во втором руководстве этой серии, «How to Set Up an Express API Server», мы рассмотрели, как создавать сервера и при помощи встроенного модуля HTTP Node.js, и при помощи фреймворка Express, а также как назначить маршруты для обработки запросов, выполняемых по различным URL-адресам.

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

Установка

На данный момент мы еще не использовали базу данных для хранения и выполнения манипуляций с какими-либо данными, так что мы установим ее сейчас. В этом руководстве мы будем использовать MySQL, и если у вас уже она установлена, то вы можете перейти к следующему разделу.

Если же нет, то вы можете скачать MAMP для macOS и Windows, который предоставляет бесплатную локальную инфраструктуру веб-сервера и базу данных. После их скачивания откройте программу и нажмите Start Servers для запуска MySQL.

Помимо настройки MySQL нам также необходимо программное обеспечение с GUI для просмотра данных базы. Если вы пользуетесь Mac, то скачайте SequelPro, если Windows – то SQLyog. После скачивания и запуска MySQL вы можете воспользоваться SequelPro или SQLyog для подключения к локальному серверу при помощи имени root и пароля root по 3306 порту.

Как только разобрались с этим, мы можем перейти к созданию базы данных для нашего API.

Создаем базу данных

В программе для просмотра вашей базы добавьте новую базу данных и назовите ее api. Убедитесь, что MySQL запущена, или у вас не получится подключиться к локальному серверу.

После создания базы api перейдите в нее и выполните следующий запрос для создания новой таблицы.

При помощи этого запроса SQL будет создана структура таблицы с нашими пользователями. У каждого пользователя будет id, значение которого приращивается автоматически, имя и адрес электронной почты.

Также мы можем заполнить базу данных теми же данными, которые в данный момент отображаем, используя статический массив данных в формате JSON, при помощи запроса INSERT.

Нет необходимости во введении поля id, поскольку его значения приращиваются автоматически. Теперь у нас имеются структура наших таблиц и некоторые пробные данные для работы.

Подключаемся к MySQL

Возвращаемся к нашему приложению, где нам необходимо подключиться к MySQL из Node для начала работы с данными. Ранее мы установили модуль npm mysql и теперь мы им воспользуемся.

Создайте новую папку под названием data и файл config.js.

Мы начнем с запрашивания модуля mysql в data/config.js.

Давайте создадим объект config, в котором будут находиться данные о хосте, имя пользователя, его пароль и название базы. В нем должна быть указана база данных api, которую мы создали, и должны использоваться настройки по умолчанию локального сервера.

Для повышения продуктивности мы создадим пул MySQL, что позволяет нам использовать множество подключений одновременно, а не открывать и закрывать их вручную.

Наконец, мы экспортируем пул MySQL, благодаря чему приложение сможет им воспользоваться.

Вы можете ознакомиться с полным конфигурационным файлом в нашем репозитории GitHub.

Теперь, когда мы подключены к базе и завершили с настройками, пришло время перейти к взаимодействию с базой данных из нашего API.

Получение данных из MySQL

В данный момент в нашем файле routes.js массив с данными о пользователях в формате JSON создается вручную и выглядит следующим образом:

Поскольку мы более не собираемся использовать статические данные, мы можем удалить весь массив и заменить его ссылкой на пул нашей базы.

Ранее при запросах по методу GET, отправляемых по адресу /users, обратно возвращались статические данные, хранящиеся в переменной users. В нашем обновленном коде эти данные будут запрашиваться из базы данных. Мы воспользуемся запросом SQL SELECT для выбора всех данных из таблицы users, что выглядит следующим образом:

Ниже показано, как будет выглядеть наша конечная точка для обработки запросов по методу GET, приходящих по адресу /users, в которой используется метод pool.query().

Тут мы выполняем запрос SELECT и затем отправляем результат в формате JSON клиенту при помощи конечной точки, в качестве URL-адреса которой указано /users.  Если вы перезапустите сервер и перейдете на страницу по адресу /users, то увидите те же данные, что и ранее, однако в этот раз они поступают динамически.

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

На данный момент URL-адреса наших конечных точек представляют из себя статические пути – будь то / или /users, но что если нам необходимо получить данные только о конкретном пользователе. Нам необходимо будет использовать изменчивый URL-адрес конечной точки.

Что касается наших пользователей, то возможно, что мы бы хотели получать информацию о каждом из них на основании их уникального id. Для этого мы бы воспользовались двоеточием (:) для указания того, что это параметр маршрута.

Мы может получить значение этого параметра при помощи свойства request.params. Поскольку наше свойство называется id, мы получим его следующим образом:

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

Мы воспользуемся ? в качестве заполнителя для предотвращения атаки в виде внедрения кода SQL и передадим id в качестве параметра, а не будем создавать строку при помощи конкатенации, что было бы менее безопасно.

Полный код ресурса для получения индивидуального пользователя теперь выглядит следующим образом:

Теперь вы можете перезапустить сервер и перейти по https://localhost/users/2 для ознакомление с информацией только о Gilfoyle. В случае ошибки вроде Cannot GET /users/2 перезапустите сервер.

При переходе по этому URL-адресу будет возвращен единственный результат.

Если это так, то мои поздравления: вы успешно создали динамический параметр маршрута!

Отправление запроса по методу POST

Пока что все, что мы выполняли, опосредовалось запросами по методу GET. Эти запросы безопасны, то есть они не меняют состояние сервера. Мы просто просматривали данные в формате JSON.

Теперь мы начнем преобразовывать наш API в динамический за счет использования запроса по методу POST для добавления новых данных.

Я упомянула ранее, в Understanding REST, что не стоит использовать глаголы вроде add или delete в URL для выполнения действий. Для того чтобы добавить нового пользователя в базу данных, мы будем выполнять POST-запрос по тому же URL, который использовали для их просмотра, однако просто установим для него отдельный маршрут.

Обратите внимание, что мы теперь используем app.post() вместо app.get().

Поскольку мы создаем, а не считываем, то воспользуемся здесь запросом INSERT, подобно тому, как мы делали при инициализации базы данных. Мы отправим все request.body в запросе SQL.

Также мы укажем в качестве значения статуса ответа 201, что означает Created. Для того чтобы получить id последнего добавленного пользователя, мы воспользуемся свойством insertId.

Код для маршрута, который принимает запросы по методу POST, будет выглядеть следующим образом:

Теперь мы можем отправить запрос по методу POST. В большинстве случаев, когда вы отправляете запрос по методу POST, вы это осуществляете при помощи веб-формы. Мы разберемся с этим ближе к концу статьи, однако наиболее быстрый и простый способ отправления пробного запроса по методу POST – при помощи cURL, используя флажок -d (--data).

Мы выполним команду curl -d, разместив после нее строку запроса со всеми парами ключ=значение и запрашиваемую конечную точку.

Сразу после отправления этого запроса вы должны получить ответ от сервера.

Если вы перейдете по http://localhost/users, то увидите последнюю добавленную в таблицу пользователей запись.

Отправление запроса по методу PUT

Запрос по методу POST полезен для добавления нового пользователя, однако нам понадобится запрос по методу PUT для изменения данных существующего пользователя. PUT – идемпотентный метод. Это означает, что при повторном выполнении запроса будет получаться тот же самый результат. Запросы по этому методу отличаются от тех, что выполняются по методу POST, поскольку при отправлении запроса для добавление нового пользователя более одного раза, будут продолжаться создаваться новые пользователи.

Что касается нашего API, то мы настроим маршрут, принимающий запросы по методу PUT, таким образом, что при помощи него можно будет отредактировать отдельного пользователя, так что мы воспользуемся параметром маршрута :id в этот раз.

Давайте создадим запрос UPDATE и убедимся при помощи условия  WHERE, что он применяется только к запрошенному id. Мы используем два заполнителя ?, и передаваемые нами значения будут добавляться последовательно.

Переходим к тестированию. Мы отредактируем пользователя под номером 2 и изменим адрес электронной почты с gilfoyle@piedpiper.com на bertram@piedpiper.com. Мы можем использовать cURL снова с флажком [-X (--request)], для того чтобы явно указать, что мы отправляем запрос по методу PUT.

Перезапустите сервер перед отправлением запроса, иначе вы получите ошибку Cannot PUT /users/2.

Вы должны будете увидеть следующее:

Данные пользователя со значением id, равным 2, теперь должны быть обновлены.

Отправление запроса по методу DELETE

Наша последняя задача для завершения реализации функциональных возможностей CRUD нашего API – добавление опции для удаления пользователя из базы. В этом запросе будет использоваться запрос SQL DELETE с условием WHERE, и благодаря нему будет удален индивидуальный пользователь, указанный при помощи параметра маршрута.

Мы можем использовать -x снова для отправления запроса на удаление данных. Давайте удалим последнего пользователя, которого создали.

Вы увидите уведомление об успешном завершении операции.

Перейдите по http://localhost:3002 и вы увидите, что теперь осталось только два пользователя.

Мои поздравления! Теперь API завершен. Посетите репозиторий GitHub, чтобы ознакомиться с полным кодом routes.js.

Отправление запросов при помощи модуля request

В начале этого руководства мы установили четыре модуля, и одни из них – request. Вместо выполнения запросов при помощи cURL вы могли бы создать новый файл со всеми данными и отправить их при помощи него. Я создам файл под названием post.js, благодаря которому будет создан новый пользователь при помощи отправления запроса по методу POST.

Мы можем запустить этот файл за счет выполнения команды node post.js в новом окне консоли, не останавливая сервер, и в результате получим тот же результат, как и при использовании cURL. Если при использовании cURL что-то не так, то модуль request оказывается полезным, поскольку мы можем ознакомиться с ошибками, ответом и телом сообщения.

Отправление запросов при помощи веб-формы

Обычно запросы, отправляемые по методу HTTP POST и остальным, при выполнении которых меняется состояние сервера, отправляются при помощи HTML-форм. В этом очень простом примере мы можем создать файл index.html где угодно и поля для заполнения имени и адреса электронной почты. В качестве адреса обработчика (* к которому обращаются данные формы при их отправке на сервер) формы будет указан адрес ресурса, в нашем случае http//localhost:3002/users, и мы укажем в качестве метода post.

Создайте index.html и добавьте туда следующий код:

Откройте этот статический HTML-файл в вашем браузере, заполните форму и отправьте ее, не отключая сервер. Вы должны будете увидеть в качестве ответа User added with ID: 4, а также новый список пользователей.

Заключение

В этом руководстве мы разобрались с тем, как подключить сервер Express к базе данных MySQL и настроить маршруты, которые соответствуют методам GET, POST, PUT и DELETE, где указываются определенные пути и динамические параметры маршрута. Также мы узнали, как отправлять запросы HTTP к API для сервера при помощи cURL, модуля request Node.js и HTML-форм.

К этому моменту у вас должно было бы сложиться очень ясное представление о том, как работают RESTful API, и теперь вы можете создать ваш собственный полностью работоспособный API, работающий на основе платформы Node.js, при помощи Express и MySQL!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.