# Создание REST API: руководство по Node.js, Express и MongoDB

Источник: https://www.youtube.com/watch?v=_7UQPve99r4
Канал: freeCodeCamp.org
Опубликовано: 14.02.2024

---

## Создание полноценного REST API: Node.js, Express и MongoDB [[JUMP:0:00]]

Для начинающих разработчиков создание бэкенда является важным шагом в освоении веб-разработки. Данный туториал от канала freeCodeCamp.org представляет собой исчерпывающее руководство по созданию RESTful CRUD API (Create, Read, Update, Delete) с использованием стека технологий Node.js, Express и MongoDB. В ходе разработки автор демонстрирует не только написание кода, но и профессиональные практики организации структуры проекта, использования инструментов тестирования и контроля версий.

## 🛠 Подготовка окружения и запуск сервера [[JUMP:0:25]]

Перед началом разработки необходимо убедиться в наличии установленных инструментов: Visual Studio Code, Node.js (последняя LTS-версия) и Git. Проверка установки осуществляется командой `node --version` в терминале.

Основные этапы настройки:

1.  **Инициализация проекта**: Создается папка проекта, в которой выполняется `npm init -y`. Это создает файл `package.json`.
2.  **Настройка сервера**: В файле `index.js` прописывается базовая логика запуска сервера.
3.  **Автоматизация запуска**: Для удобства разработки в `package.json` добавляется скрипт `serve` (`node index.js`).
4.  **Установка Express**: С помощью `npm install express` устанавливается веб-фреймворк.
5.  **Использование Nodemon**: Чтобы не перезапускать сервер вручную при каждом изменении, устанавливается `nodemon` (`npm install -D nodemon`), а в скрипты добавляется команда `dev` (`nodemon index.js`).

## 🗄 Работа с базой данных MongoDB [[JUMP:19:29]]

Для хранения данных используется облачное решение MongoDB Atlas. После создания бесплатного кластера (уровень M0) и настройки доступа по IP-адресу (разрешение 0.0.0.0/0), генерируется строка подключения.

*   **Библиотека Mongoose**: Используется для упрощения взаимодействия с MongoDB.
*   **Создание модели**: В папке `models` создается файл `product.model.js`. Схема данных (`productSchema`) включает поля `name` (строка, обязательно), `quantity` (число, по умолчанию 0), `price` (число, по умолчанию 0) и `image` (необязательная строка).
*   **Временные метки**: Использование `timestamps: true` автоматически добавляет поля `createdAt` и `updatedAt`.
*   **Подключение**: В `index.js` с помощью `mongoose.connect()` устанавливается соединение, после чего запускается сервер.

## 🚀 Реализация CRUD-операций [[JUMP:34:03]]

Разработка API ведется через построение маршрутов, каждый из которых обрабатывает определенный метод HTTP:

*   **POST** (`/api/products`): Создание нового продукта. Используется `Product.create()`. Важно: для корректного чтения JSON-данных из тела запроса необходимо подключить middleware `app.use(express.json())`.
*   **GET** (`/api/products`): Получение списка всех продуктов через `Product.find({})`.
*   **GET** (`/api/product/:id`): Получение конкретного продукта по ID. ID извлекается из параметров URL через `req.params`.
*   **PUT** (`/api/product/:id`): Обновление существующего продукта методом `findByIdAndUpdate()`.
*   **DELETE** (`/api/product/:id`): Удаление продукта методом `findByIdAndDelete()`.

Для тестирования API автор рекомендует инструменты **Thunder Client**, **Insomnia** или **Postman**. Также была продемонстрирована настройка middleware `express.urlencoded({extended: false})` для обработки форм.

## 📂 Профессиональная архитектура проекта [[JUMP:109:26]]

По мере роста приложения хранение всей логики в `index.js` становится неэффективным. Автор переносит код в модульную структуру:

1.  **Контроллеры (`controllers/product.controller.js`)**: Содержат бизнес-логику для каждой операции (get, post, update, delete).
2.  **Маршруты (`routes/product.route.js`)**: Определяют пути доступа, связывая их с соответствующими функциями контроллера.

В итоге файл `index.js` становится «точкой входа», где подключаются маршруты через `app.use('/api/products', productRoute)`, что значительно повышает читаемость и поддерживаемость кода. В завершение проект был загружен на GitHub с использованием `.gitignore` для исключения папки `node_modules`.