Создание REST API на Node.js: пошаговое руководство от эксперта

Создание 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

от автора

написал в