Создание REST API на Node.js: пошаговое руководство
Привет, коллеги! Меня зовут Кирилл Алехин — предприниматель, атишник и основатель веб-студии XSL в ОАЭ. Сегодня я поделюсь с вами пошаговым руководством по созданию REST API на Node.js. Этот стек мы активно используем в наших проектах, и я уверен, что он станет отличным выбором и для ваших задач.
REST API — это основа современных веб-приложений. Он позволяет клиентам (веб-сайтам, мобильным приложениям) взаимодействовать с сервером через стандартные HTTP-запросы. Node.js, благодаря своей асинхронной природе и богатой экосистеме, идеально подходит для создания быстрых и масштабируемых API.
Что нам понадобится?
- Node.js (версия 16 или выше)
- npm или yarn (для управления пакетами)
- Текстовый редактор (VS Code, WebStorm и т.д.)
- Postman или Insomnia (для тестирования API)
- MongoDB (для хранения данных, можно использовать облачную версию)
Шаг 1: Инициализация проекта
Создадим новую папку для проекта и инициализируем его:
mkdir node-api
cd node-api
npm init -y
Флаг -y создаст файл package.json с дефолтными настройками.
Шаг 2: Установка зависимостей
Нам понадобятся следующие пакеты:
- Express — фреймворк для создания сервера и маршрутов.
- Mongoose — библиотека для работы с MongoDB.
- dotenv — для управления переменными окружения.
- cors — для обработки CORS-запросов.
Установим их одной командой:
npm install express mongoose dotenv cors
Шаг 3: Создание структуры проекта
Организуем проект следующим образом:
node-api/
├── .env
├── app.js
├── models/
│ └── Product.js
├── controllers/
│ └── productController.js
├── routes/
│ └── productRoutes.js
Шаг 4: Настройка Express-сервера
Откроем файл app.js и добавим базовую конфигурацию:
const express = require('express');
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const cors = require('cors');
dotenv.config();
const app = express();
// Middleware
app.use(cors());
app.use(express.json());
// Маршруты
const productRoutes = require('./routes/productRoutes');
app.use('/api/products', productRoutes);
// Подключение к MongoDB
mongoose.connect(process.env.MONGO_URI)
.then(() => console.log('Connected to MongoDB'))
.catch(err => console.error('MongoDB connection error:', err));
// Запуск сервера
const PORT = process.env.PORT || 5000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
Шаг 5: Создание модели данных
В файле models/Product.js определим схему для нашего продукта:
const mongoose = require('mongoose');
const productSchema = new mongoose.Schema({
name: {
type: String,
required: true
},
price: {
type: Number,
required: true
},
description: {
type: String
},
createdAt: {
type: Date,
default: Date.now
}
});
module.exports = mongoose.model('Product', productSchema);
Шаг 6: Создание контроллера
В файле controllers/productController.js реализуем логику обработки запросов:
const Product = require('../models/Product');
// Получение всех продуктов
exports.getAllProducts = async (req, res) => {
try {
const products = await Product.find();
res.json(products);
} catch (err) {
res.status(500).json({ message: err.message });
}
};
// Создание нового продукта
exports.createProduct = async (req, res) => {
const product = new Product({
name: req.body.name,
price: req.body.price,
description: req.body.description
});
try {
const newProduct = await product.save();
res.status(201).json(newProduct);
} catch (err) {
res.status(400).json({ message: err.message });
}
};
// Получение продукта по ID
exports.getProductById = async (req, res) => {
try {
const product = await Product.findById(req.params.id);
if (!product) {
return res.status(404).json({ message: 'Product not found' });
}
res.json(product);
} catch (err) {
res.status(500).json({ message: err.message });
}
};
// Обновление продукта
exports.updateProduct = async (req, res) => {
try {
const product = await Product.findById(req.params.id);
if (!product) {
return res.status(404).json({ message: 'Product not found' });
}
product.name = req.body.name || product.name;
product.price = req.body.price || product.price;
product.description = req.body.description || product.description;
const updatedProduct = await product.save();
res.json(updatedProduct);
} catch (err) {
res.status(400).json({ message: err.message });
}
};
// Удаление продукта
exports.deleteProduct = async (req, res) => {
try {
const product = await Product.findByIdAndDelete(req.params.id);
if (!product) {
return res.status(404).json({ message: 'Product not found' });
}
res.json({ message: 'Product deleted' });
} catch (err) {
res.status(500).json({ message: err.message });
}
};
Шаг 7: Создание маршрутов
В файле routes/productRoutes.js определим маршруты для нашего API:
const express = require('express');
const router = express.Router();
const productController = require('../controllers/productController');
// Получение всех продуктов и создание нового
router.route('/')
.get(productController.getAllProducts)
.post(productController.createProduct);
// Получение, обновление и удаление продукта по ID
router.route('/:id')
.get(productController.getProductById)
.put(productController.updateProduct)
.delete(productController.deleteProduct);
module.exports = router;
Шаг 8: Настройка переменных окружения
Создадим файл .env и добавим в него строку подключения к MongoDB:
MONGO_URI=mongodb+srv://<username>:<password>@cluster0.example.mongodb.net/node-api?retryWrites=true&w=majority
PORT=5000
Замените <username> и <password> на ваши учетные данные MongoDB.
Шаг 9: Запуск и тестирование API
Запустим сервер:
node app.js
Теперь можно протестировать API с помощью Postman или Insomnia. Вот примеры запросов:
- GET
http://localhost:5000/api/products— получение всех продуктов. - POST
http://localhost:5000/api/products— создание нового продукта (не забудьте указать тело запроса в формате JSON). - GET
http://localhost:5000/api/products/:id— получение продукта по ID. - PUT
http://localhost:5000/api/products/:id— обновление продукта. - DELETE
http://localhost:5000/api/products/:id— удаление продукта.
Шаг 10: Дополнительные улучшения
Чтобы сделать ваш API более надежным и безопасным, рекомендую добавить:
- Валидацию данных с помощью библиотеки
joiилиexpress-validator. - Аутентификацию с использованием JWT (JSON Web Tokens).
- Логирование с помощью
morganилиwinston. - Обработку ошибок с помощью middleware.
- Документацию API с помощью Swagger или Postman.
Заключение
Поздравляю! Вы только что создали полноценный REST API на Node.js. Этот стек мы активно используем в нашей веб-студии XSL для разработки масштабируемых и быстрых решений. Node.js позволяет быстро разрабатывать и развертывать API, а MongoDB обеспечивает гибкость в работе с данными.
Если у вас возникнут вопросы или понадобится помощь в реализации более сложных проектов — обращайтесь. Мы всегда рады новым вызовам и интересным задачам!
Удачи в разработке!
Кирилл Алехин, основатель веб-студии XSL
