
Express.js: создание REST API
Express.js — это минималистичный и гибкий фреймворк для Node.js, который позволяет быстро создавать REST API и веб-приложения. Благодаря простому синтаксису и большому количеству расширений Express.js стал стандартом де-факто для разработки серверных приложений на JavaScript. В этой статье рассмотрим основные этапы создания REST API на Express.js, разберём примеры кода и дадим пояснения к каждому шагу.
Установка Express.js
Перед началом работы убедитесь, что у вас установлен Node.js — это среда выполнения JavaScript вне браузера. Express.js работает поверх Node.js и использует его возможности для обработки HTTP-запросов.
Создайте новую папку для проекта и выполните инициализацию npm — это создаст файл package.json
, в котором будут храниться зависимости и настройки проекта. Затем установите сам Express:
mkdir express-rest-api
cd express-rest-api
npm init -y
npm install express
npm init -y
— быстро создаёт файлpackage.json
с настройками по умолчанию.npm install express
— устанавливает Express.js как зависимость проекта.
Базовый пример API
Теперь создадим минимальный сервер. Для этого создайте файл index.js
и добавьте следующий код:
const express = require('express');
const app = express();
const PORT = 3000;
app.use(express.json()); // Для парсинга JSON в теле запроса
app.get('/', (req, res) => {
res.json({ message: 'Добро пожаловать в Express API!' });
});
app.listen(PORT, () => {
console.log(`Сервер запущен на http://localhost:${PORT}`);
});
Пояснения:
const express = require('express');
— импортируем библиотеку Express.const app = express();
— создаём экземпляр приложения Express.app.use(express.json());
— добавляем middleware для автоматического парсинга JSON в теле входящих запросов (это важно для работы с API).app.get('/', ...)
— определяем маршрут для главной страницы (/
), который возвращает JSON-ответ с приветствием.app.listen(PORT, ...)
— запускаем сервер на порту 3000 и выводим сообщение в консоль.
Теперь запустите сервер командой:
node index.js
Если вы перейдёте по адресу http://localhost:3000, то увидите JSON-ответ: { "message": "Добро пожаловать в Express API!" }
. Это значит, что сервер работает корректно.
Роутинг и обработка запросов
REST API обычно работает с коллекциями данных. Для примера реализуем простейшее хранилище статей в памяти (массив объектов) и добавим маршруты для CRUD-операций (создание, чтение, удаление).
let articles = [
{ id: 1, title: 'Первая статья', content: 'Текст первой статьи' },
{ id: 2, title: 'Вторая статья', content: 'Текст второй статьи' }
];
// Получить все статьи
app.get('/articles', (req, res) => {
res.json(articles);
});
// Получить статью по id
app.get('/articles/:id', (req, res) => {
const article = articles.find(a => a.id === parseInt(req.params.id));
if (!article) {
return res.status(404).json({ error: 'Статья не найдена' });
}
res.json(article);
});
// Создать новую статью
app.post('/articles', (req, res) => {
const { title, content } = req.body;
if (!title || !content) {
return res.status(400).json({ error: 'Требуются title и content' });
}
const newArticle = {
id: articles.length + 1,
title,
content
};
articles.push(newArticle);
res.status(201).json(newArticle);
});
// Удалить статью
app.delete('/articles/:id', (req, res) => {
const id = parseInt(req.params.id);
const index = articles.findIndex(a => a.id === id);
if (index === -1) {
return res.status(404).json({ error: 'Статья не найдена' });
}
articles.splice(index, 1);
res.status(204).send();
});
Пояснения к коду:
let articles = [...]
— временное хранилище статей. В реальных приложениях данные обычно хранятся в базе данных.app.get('/articles', ...)
— возвращает список всех статей в формате JSON.app.get('/articles/:id', ...)
— ищет статью по идентификатору, переданному в URL. Если статья не найдена, возвращает ошибку 404.app.post('/articles', ...)
— создаёт новую статью. Ожидает, что в теле запроса будет JSON с полямиtitle
иcontent
. Если данные не переданы, возвращает ошибку 400.app.delete('/articles/:id', ...)
— удаляет статью по id. Если статья не найдена, возвращает ошибку 404. Если удаление прошло успешно, возвращает статус 204 (без содержимого).
Важно: В этом примере данные хранятся только в оперативной памяти сервера. После перезапуска сервера все статьи будут сброшены. Для реальных проектов используйте базы данных (например, MongoDB, PostgreSQL).
Обработка ошибок
В Express.js можно централизованно обрабатывать ошибки с помощью специального middleware. Это позволяет не дублировать обработку ошибок в каждом маршруте и возвращать единообразные ответы клиенту.
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ error: 'Внутренняя ошибка сервера' });
});
Пояснения:
- Этот middleware должен быть добавлен после всех маршрутов. Если в процессе обработки запроса возникнет ошибка (например, выброшено исключение), Express передаст её сюда.
- Внутри middleware можно залогировать ошибку и отправить клиенту стандартный ответ с кодом 500.
Лучшие практики
Чтобы ваш API был надёжным, масштабируемым и удобным для поддержки, следуйте ряду рекомендаций:
- Используйте dotenv для хранения конфиденциальных данных и настроек (например, порт, строки подключения к БД) в отдельном файле
.env
. - Разделяйте маршруты и бизнес-логику по разным файлам и папкам. Это упростит поддержку и развитие проекта.
- Валидируйте входящие данные с помощью библиотек, например, Joi. Это поможет избежать ошибок и повысит безопасность.
- Добавьте логирование запросов и ошибок с помощью morgan или других инструментов.
- Для production-окружения используйте процесс-менеджер, например, PM2, чтобы автоматически перезапускать сервер при сбоях и управлять несколькими инстансами.
Заключение
Express.js — отличный выбор для быстрого создания REST API на Node.js. Благодаря простоте и гибкости вы можете реализовать как простые, так и сложные серверные приложения. Следуйте лучшим практикам, структурируйте код и не забывайте о безопасности — и ваш API будет надёжным и масштабируемым.
Если у вас остались вопросы или вы хотите узнать больше о продвинутых возможностях Express.js (middleware, аутентификация, интеграция с базами данных) — пишите в комментариях или читайте официальную документацию Express.