Шаг 1: Настройка проекта. Убедитесь, что на вашей системе установлен Node.js (версии 18 или выше рекомендуется). Создайте новую директорию для проекта и инициализируйте его: откройте терминал и выполните `npm init -y`. Это создаст файл `package.json`. Теперь установите Express: `npm install express`. Для разработки также рекомендуется сразу установить `nodemon` как dev-зависимость для автоматической перезагрузки сервера при изменениях: `npm install --save-dev nodemon`. В `package.json` добавьте в раздел `"scripts"` строку: `"dev": "nodemon server.js"`.
Шаг 2: Создание базового сервера. Создайте файл `server.js` в корне проекта. Импортируйте Express и создайте экземпляр приложения:
`const express = require('express');`
`const app = express();`
`const PORT = process.env.PORT || 3000;`
Затем определите базовый маршрут для проверки:
`app.get('/', (req, res) => {`
` res.send('Hello from Express API!');`
`});`
И наконец, запустите сервер:
`app.listen(PORT, () => {`
` console.log(`Server is running on port ${PORT}`);`
`});`
Запустите сервер командой `npm run dev` и откройте в браузере `http://localhost:3000`. Вы должны увидеть приветственное сообщение.
Шаг 3: Работа с middleware. Middleware — это функции, которые имеют доступ к объектам запроса (req), ответа (res) и следующей функции middleware в цикле запрос-ответ. Express поставляется с некоторыми встроенными middleware, но самые важные для API нужно подключать отдельно. Для парсинга JSON в теле запроса используйте `express.json()`: `app.use(express.json());`. Для парсинга данных из форм (url-encoded) используйте `express.urlencoded({ extended: true })`. Эти middleware должны быть подключены до определения ваших маршрутов. Также рассмотрите подключение middleware для логирования, например, `morgan`: `npm install morgan`, а затем `const morgan = require('morgan'); app.use(morgan('dev'));`.
Шаг 4: Проектирование и реализация маршрутов REST API. Давайте создадим простое API для управления списком задач (To-Do). Создадим структуру маршрутов:
- GET `/api/tasks` — получить все задачи.
- GET `/api/tasks/:id` — получить задачу по ID.
- POST `/api/tasks` — создать новую задачу.
- PUT `/api/tasks/:id` — обновить задачу.
- DELETE `/api/tasks/:id` — удалить задачу.
` res.json(tasks);`
`});`
Для создания задачи (POST):
`app.post('/api/tasks', (req, res) => {`
` const newTask = { id: Date.now().toString(), ...req.body };`
` tasks.push(newTask);`
` res.status(201).json(newTask); // Код 201 - Created`
`});`
Обратите внимание на использование `req.body`, который становится доступен благодаря middleware `express.json()`.
Шаг 5: Обработка ошибок и валидация. Простой API должен корректно обрабатывать ошибки. Например, при запросе несуществующей задачи нужно вернуть статус 404. Добавьте проверку в обработчик GET по ID:
`app.get('/api/tasks/:id', (req, res) => {`
` const task = tasks.find(t => t.id === req.params.id);`
` if (!task) {`
` return res.status(404).json({ message: 'Task not found' });`
` }`
` res.json(task);`
`});`
Для централизованной обработки ошибок создайте middleware в конце файла, после всех маршрутов:
`app.use((err, req, res, next) => {`
` console.error(err.stack);`
` res.status(500).json({ message: 'Something went wrong!' });`
`});`
Для валидации входящих данных рассмотрите использование библиотек типа `joi` или `express-validator`.
Шаг 6: Структурирование проекта. По мере роста приложения, код в одном файле становится неуправляемым. Рекомендуется разделить логику по папкам: `routes/` (для маршрутов), `controllers/` (для обработчиков бизнес-логики), `models/` (для описания данных), `middlewares/` (для кастомных middleware). Например, создайте файл `routes/taskRoutes.js`, переместите туда все маршруты, связанные с задачами, и подключите их в `server.js` с помощью `app.use('/api/tasks', require('./routes/taskRoutes'));`.
Шаг 7: Подключение к реальной базе данных. Замените массив в памяти на постоянное хранилище. Для начала можно использовать SQLite с помощью `npm install sqlite3` или MongoDB с `mongoose`. Создайте подключение к БД в отдельном файле (например, `config/db.js`) и используйте его в контроллерах. Это добавит асинхронности, поэтому не забудьте использовать `async/await` в обработчиках маршрутов.
Шаг 8: Защита API (Безопасность). Добавьте ключевые элементы безопасности: 1) Используйте `helmet` для установки security-заголовков: `npm install helmet`, затем `app.use(helmet());`. 2) Реализуйте ограничение запросов (rate limiting) с помощью `express-rate-limit` для защиты от brute-force атак. 3) Для аутентификации и авторизации рассмотрите использование JWT (JSON Web Tokens) с библиотекой `jsonwebtoken` и `bcryptjs` для хеширования паролей. Создайте middleware для проверки токена, который будет защищать приватные маршруты.
Шаг 9: Документирование и тестирование API. Документируйте ваши эндпоинты с помощью Swagger/OpenAPI. Установите `swagger-jsdoc` и `swagger-ui-express` и настройте спецификацию. Для тестирования API используйте Supertest вместе с Jest. Напишите unit-тесты для контроллеров и интеграционные тесты для маршрутов, чтобы обеспечить надежность кода.
Следуя этим шагам, вы создадите чистое, структурированное и безопасное REST API на Express.js, готовое к дальнейшему масштабированию и интеграции с фронтенд-приложениями или мобильными клиентами.
Комментарии (9)