RESTful API на Node.js

Node.js - это замечательный инструмент. Если вы новичок, начинающий программист или студент ИТ, возможно, вам будет сложно по началу, но когда вы в конце концов привыкнете к этому. В этом руководстве вы познакомитесь с основами проектирования API, узнаете, как настроить основу API REST и как логически структурировать код.

Я бы хотел, чтобы вы кодировали параллельно с тем, как раскрывается статья. За каждым фрагментом кода следует объяснение.

Перед тем, как я начну, есть некоторые вещи, которые вам нужно знать относительно Node.js и некоторых стандартов EcmaScript, которые я буду использовать в самом руководстве. Я не буду использовать ES6, так как считаю, что он не так прост для начинающих, как традиционный JavaScript. Тем не менее, я ожидаю, что вы уже знаете основы Node.js. Если нет, пожалуйста, вернитесь назад и изучите перед тем, чтобы двигаться дальше.

Готовы к верстке?

Нет, просто шучу. Нам нужно настроить и установить необходимые зависимости и модули узлов, чтобы приложение работало правильно. Поскольку мы будем создавать API, очевидно, что необходима база данных. Мы будем использовать MongoDB, базу данных NOSQL. Это оптимальный выбор для наших нужд, поскольку нам не нужна реляционная база данных. Вместо того, чтобы устанавливать и запускать его локально, мы просто подключим базу данных sandbox на mLab, для простоты.

Идем дальше, создаем учетную запись и создаем новое развертывание MongoDB.

На домашней странице своей учетной записи создайте новое развертывание MongoDB.

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

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

Добавьте нового пользователя в свою базу данных

Правильно. Теперь база данных готова к использованию. Вы будете подключаться к нему с использованием MongoDB URI, указанного ниже.

Итак, вы готовы начать настройку самого приложения. Инициализируйте npm и установите следующие модули:

 

Мы будем использовать Express для этого приложения, поскольку он является стандартом для большинства приложений Node сегодня. Mongoose - это ORM-объектный реляционный маппер. Официальное ORM используется для MongoDB. Чтобы ее разбить, мы используем ORM для упрощения передачи данных между нашим приложением и базой данных. Он отображает данные, содержащиеся в нашем приложении, чтобы поддерживать набор строгих правил, установленных базой данных. Модуль body-parser - это просто промежуточное ПО, которое мы используем для анализа наших данных, отправленных через HTTP-запросы.

Наконец-то вы можете начать написание кода.

Давайте начнем с основной части. Чтобы начать его, создайте файл приложения и выполните базовую настройку. Напишите это в своем app.js.

 

Этот файл будет использоваться для настройки приложения и только этого. Вся логика будет помещена в соответствующий каталог относительно конкретной функции, которую она будет реализовывать. Мы используем module.exports, чтобы сделать этот объект app видимым для остальной части программы, когда мы вызываем его с помощью require ().

Теперь нам нужно указать приложение, где слушать. Идем дальше и создадим еще один файл с именем server.js и запишем это.

 

Здесь вы можете поместить приложение в переменную. Это приложение является фактическим объектом приложения, созданным вами в app.js. Продолжайте, выбрав порт для запуска приложения и, наконец, разверните сервер с помощью app.listen. Идем дальше и запускаем окно терминала и проверяем, работает ли это. Перейдите в каталог, в котором были созданы эти файлы, и запустите узел server.js. Вы должны увидеть, как Express-сервер прослушивает порт 3000, регистрируется в командной строке.

Поздравляю, вы запустили сервер!

Когда сервер запущен и работает, теперь вам нужно подключить базу данных. Вернитесь в свой текстовый редактор и создайте новый файл, назовите его db.js, так как он будет использоваться для хранения вашего соединения с базой данных. Это должно выглядеть так:

 

Измените yourDatabaseURI на URI, упомянутого выше. Вернитесь к своей учетной записи mLab и скопируйте MongoDB URI. Вставьте его в свой код между двумя кавычками. Измените <dbuser> и <dbpassword> для учетных данных, введенных для созданного вами пользователя. Сделав это, вы должны сообщить приложению, что у него есть доступное соединение. Просто добавьте require () в app.js, например:

 

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

Теперь ваша программа должна иметь три файла. App.js для настройки приложения, db.js для указания соединения с базой данных и server.js для разворачивания узла на конкретном порту по вашему выбору.

Теперь вы готовы приступить к написанию бизнес-логики своей программы.

Приступаем к делу.

Начните с создания новой папки с именем user. Эта папка будет содержать все файлы, имеющие отношение к нашему общению с базой данных относительно пользователей. Вы начнете с создания модели пользователя. Эта модель будет служить планом, показывающим, как будут выглядеть все пользователи в вашей базе данных. Создайте файл с именем User.js и напишите этот фрагмент кода:

 

Вы создаете схему, которая даст каждому пользователю в базе данных особый вид. У пользователя будет имя, адрес электронной почты и пароль. Указав mongoose.model («Пользователь», UserSchema), вы привязываете схему схемы к модели, которая называется «Пользователь». Это то, что вы будете использовать для доступа к данным в базе данных, и именно поэтому вы экспортируете его для использования в других частях вашей программы.

Теперь самое интересное, создание маршрутов для вашего приложения и привязка их к соответствующим действиям.

Создайте другой файл и назовите его UserController.js. Вы назовете его так не только для простоты, но и потому, что он будет содержать действия, которые контролируют поток данных в вашу базу данных и из нее.

Выше приведена простая схема пользовательского контроллера. Вы будете использовать экспресс-маршрутизатор, чтобы создать подмножество маршрутов, которые могут быть модульными и независимыми от всего приложения. Если вам понадобится перестроить свою программу, вы можете легко сделать это, потому что этот подход дает вам возможность просто подключить его из одного места и подключить к другому. Модуль body-parser используется в качестве промежуточного ПО для обработки данных более элегантным способом. Это пригодится при отправке данных через HTTP-запросы с использованием форм.

Забавная часть поставляется только с require ('./ User'). Теперь вы видите, почему вам нужно было экспортировать модель из User.js. Вы начнете использовать его по-настоящему в UserController.js. Всякий раз, когда вы создаете модель, как вы делали выше, она автоматически получает все необходимые методы для взаимодействия с базой данных, включая операции создания, чтения, обновления и удаления. Наконец, в нижней части файла вы экспортируете маршрутизатор, как он будет необходим в app.js.

Я отвлекся!

Давайте просто сделаем краткое введение в REST, чтобы лучше понять 4 действия, которые у нас есть для взаимодействия с базой данных. Их называют CRUD. Используя HTTP-запросы, мы можем использовать соответствующее действие для запуска каждой из этих четырех операций CRUD.

POST используется для отправки данных на сервер - CREATE

GET используется для извлечения данных с сервера - READ

PUT используется для отправки и обновления данных - UPDATE

DELETE используется для удаления данных - DELETE

Лучший способ понять это - погрузиться в этот процесс.

Вернемся к делу.

Посмотрев на первый метод, вы увидите, что у объекта router есть метод .post, который принимает два параметра. Первый - это маршрут, который будет связан с функцией. Эта функция является вторым параметром. Он принимает еще два параметра, которые представляют собой запрос к серверу и ответ от сервера. Внутри функции вы будете использовать модель пользователя, указанную выше. Пользовательская модель имеет метод create, который также принимает два параметра. Это первый объект, а второй - функция. Объект содержит значения, которые необходимо вставить в базу данных. Они структурированы как схема, которую вы создали выше. После его создания функция обратного вызова вызывается с двумя другими параметрами, значением ошибки и значением успеха. Вы проверите, была ли ошибка во время создания нового пользователя.
 

Второй способ немного проще. Объект router также имеет метод .get, который также принимает два параметра. Внутри функции вы теперь вызываете метод find () для модели пользователя, который также принимает два параметра. Find - метод, возвращающий значения из базы данных. Его первый параметр, объект, определяет требования, которые должны быть выполнены для того, чтобы вернуть значения. Как и в этом примере, объект пуст, все пользователи из базы данных будут возвращены.

Теперь вам нужно сообщить программе, что у нее есть пользовательский контроллер. Добавьте это в свой app.js.

Итак, что здесь происходит? Мы ничего не будем делать на самом деле. Требуется пользовательский контроллер и приложение app.use, чтобы приложение связывало его с маршрутом / пользователями. Теперь / route внутри вашего пользовательского контроллера будет отображаться на / users. Круто, правда?

Давайте сделаем перерыв и протестируем наше приложение. Для тестирования API-интерфейсов я всегда использую Postman. Это потрясающий инструмент для тестирования URL-адресов со всеми четырьмя HTTP-действиями. Это также добавляет возможность отправки данных в теле HTTP-запросов. Именно то, что вам нужно, чтобы протестировать свое приложение. Загрузите, установите и запустите Postman и следуйте дальше.

Postman - довольно простой инструмент, вы вводите URL-адрес, на который хотите отправить HTTP-запрос, выберите метод и, если нужно, введите параметры. Начнем с отправки запроса POST на http: // localhost: 3000 / users. Это означает, что вам нужно будет ввести набор параметров в теле запроса.

Переключитесь на вкладку body и введите пары ключ-значение, соответствующие модели пользователя, которую вы создали ранее. Вам нужно имя, адрес электронной почты и пароль. Нажмите отправить. Вуаля! Ответ. Если все прошло нормально, ответ будет содержать данные, соответствующие недавно созданному пользователю.

Теперь, перейдите вперед и измените HTTP-метод на GET, и нажмите отправить еще раз. Вы увидите, что все созданные пользователи возвращаются из базы данных. Давайте немного поиграем с этим, добавим еще нескольких пользователей и посмотрим, как ведет себя GET-запрос.
Вернемся к коду.

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

Теперь вы добавили еще один запрос GET, но посмотрите на маршрут, первый параметр метода router.get. Теперь оно имеет значение, состоящее из двоеточия, за которым следует некоторый текст. Это обозначение означает, что это местозаполнитель для параметра запроса, простого значения, которое будет отправлено вместе с запросом. Значение, переданное '/: id', будет доступно через объект req.params. Где имя параметра запроса будет сопоставлено свойству с тем же именем в объекте req.params.

Двигаясь дальше, Mongoose имеет удивительный метод под названием .findById, которому будет нужен ID, по которому он будет возвращать пользователя. Идентификатор является первым параметром, а функция обратного вызова - вторым. Тот же шаблон можно увидеть и с запросом DELETE.

Метод router.delete выглядит точно так же, как и файл router.get выше. Даже метод Mongoose выглядит так же, за исключением его имени. Вы удалите пользователя из базы данных, предоставив методу идентификатор пользователя, которого вы хотите удалить. Метод .findByIdAndRemove найдет пользователя так же, как findById, но также удалит его из базы данных.
Последним шагом в вашем приложении будет реализация способа обновления существующего пользователя в базе данных. Это делается с помощью запроса PUT.

Запрос router.put очень похож на два запроса, которые вы написали выше. Он также принимает один параметр запроса, идентификатор. Из-за чего он отличается от параметров тела, как и запрос POST, который вы написали первым. Единственными методами HTTP, которые имеют body, являются POST и PUT. Помни это.

Угадайте, что делает .findByIdAndUpdate? Ты прав. Этот метод немного отличается от тех, что вы написали выше. Он принимает три основных параметра, идентификатор, объект, соответствующий пользователю, значения которого будут обновлены, и, конечно же, функцию обратного вызова. Вы будете передавать тело запроса как второй параметр, объект, поскольку он уже будет корректно проанализирован с помощью промежуточного программного обеспечения, которое мы запрашивали и которое используется в верхней части UserController.js. Хорошей практикой при обновлении некоторых значений является запрос обратно обновленного значения. Это важно, так как вы хотите иметь доступ к обновленному значению. Следовательно, вы добавляете еще один, четвертый параметр {new:true}, который обозначает вариант, в котором версия значения, в вашем случае пользователь, который вы хотите вернуть. Возврат этого значения покажет вам обновленного пользователя.

Программирование часто представляет собой баланс между хаосом и безмятежностью. Хаос решения проблем кажется нелогичным, по сравнению с безмятежностью, когда вы, наконец, решаете их. Тестирование - это то, как вы получаете спокойствие. Я натолкнулся на высказывание, глубоко укоренившееся в мышлении всех кодеров, которых я когда-либо встречал.

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

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

Снова запустите командную строку и разверните свой сервер с узлом server.js. Откройте Postman и попробуйте новые методы, которые вы только что создали. Обычный запрос GET для одного пользователя выглядел бы примерно так:

Добавление идентификатора пользователя в URL в качестве параметра запроса приведет к возврату только пользователя с таким ID.

Перейдя к запросу PUT, измените метод на PUT, добавьте значения в тело (убедитесь, что свойства соответствуют свойствам схемы пользователя, созданной выше) и нажмите send.

Вы думаете, это все?

Вы только выскоблили наконечник огромного айсберга. Но пока этого достаточно. Будьте любопытны, задавайте вопросы и продолжайте нажимать кнопки. Я дал вам основы основных умений.

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

Сервер прослушивает HTTP-запрос для попадания в маршрут «/: id» с помощью метода GET. При возникновении такого запроса будет вызвана функция обратного вызова. Все внутри этой функции будет оценено и выполнено. Знакомо, не так ли?