Express.js + MongoDB: NoSQL база данных
2025-07-24

Express.js + MongoDB: NoSQL база данных

MongoDB — это популярная NoSQL база данных, которая идеально подходит для хранения документов в формате JSON. В связке с Express.js и библиотекой Mongoose можно быстро создавать масштабируемые приложения с гибкой структурой данных. В этой статье рассмотрим, как подключить MongoDB к Express.js, создавать модели, выполнять CRUD-операции и использовать лучшие практики.

Введение

В современном веб-разработке всё чаще используют NoSQL базы данных для хранения больших объёмов данных с гибкой структурой. MongoDB — одна из самых популярных NoSQL СУБД, которая хранит данные в виде документов (JSON-подобных объектов). Это позволяет легко изменять структуру данных без необходимости сложных миграций, как в реляционных базах.

Express.js — минималистичный и гибкий фреймворк для Node.js, который отлично подходит для создания API и серверных приложений. Вместе с Mongoose (ODM для MongoDB) эта связка позволяет быстро реализовать полноценный backend.

1. Установка зависимостей

Для работы с MongoDB в Node.js-проектах чаще всего используют библиотеку mongoose:

npm install express mongoose
  • express — основной фреймворк для создания API.
  • mongoose — ODM (Object Data Modeling) для работы с MongoDB, который позволяет описывать структуру документов, валидировать данные и удобно работать с коллекциями.

2. Подключение к MongoDB

Для начала создайте файл app.js. В этом файле будет происходить инициализация приложения и подключение к базе данных. Подключение к MongoDB осуществляется с помощью метода mongoose.connect, которому передаётся строка подключения и параметры.

const express = require('express');
const mongoose = require('mongoose');

const app = express();
app.use(express.json());

mongoose.connect('mongodb://localhost:27017/express_mongo_demo', {
  useNewUrlParser: true,
  useUnifiedTopology: true
})
.then(() => console.log('MongoDB подключена'))
.catch(err => console.error('Ошибка подключения к MongoDB:', err));

const PORT = 3000;
app.listen(PORT, () => {
  console.log(`Сервер запущен на http://localhost:${PORT}`);
});

Пояснения:

  • mongoose.connect(...) — подключение к локальной базе данных MongoDB. Если база с таким именем не существует, MongoDB создаст её автоматически при первом сохранении данных.
  • useNewUrlParser и useUnifiedTopology — рекомендуемые параметры для новых проектов, обеспечивают стабильную работу драйвера.
  • app.use(express.json()) — middleware для автоматического парсинга JSON в теле запросов, что удобно для работы с API.
  • После успешного подключения к базе в консоль выводится сообщение, иначе — ошибка.

3. Создание модели (схемы)

В MongoDB нет жёсткой схемы данных, но с помощью Mongoose можно описать структуру документов, что облегчает валидацию и работу с коллекцией. Например, создадим схему для статей:

const articleSchema = new mongoose.Schema({
  title: { type: String, required: true },
  content: { type: String, required: true },
  createdAt: { type: Date, default: Date.now }
});

const Article = mongoose.model('Article', articleSchema);

Пояснения:

  • title и content — обязательные поля типа строка. Если не передать одно из них, Mongoose вернёт ошибку валидации.
  • createdAt — дата создания, по умолчанию устанавливается текущая дата и время.
  • mongoose.model('Article', articleSchema) — создаёт модель, с помощью которой можно выполнять операции с коллекцией articles в базе данных.

4. CRUD-операции с MongoDB

Теперь реализуем основные маршруты для работы с коллекцией статей. Каждый маршрут будет выполнять определённую операцию: создание, получение всех статей, получение по id и удаление.

Получить все статьи

app.get('/articles', async (req, res) => {
  const articles = await Article.find();
  res.json(articles);
});

Пояснения:

  • Article.find() — возвращает все документы из коллекции. Запрос асинхронный, поэтому используется await.
  • Результат возвращается в формате JSON.

Получить статью по id

app.get('/articles/:id', async (req, res) => {
  try {
    const article = await Article.findById(req.params.id);
    if (!article) return res.status(404).json({ error: 'Статья не найдена' });
    res.json(article);
  } catch (err) {
    res.status(400).json({ error: 'Некорректный ID' });
  }
});

Пояснения:

  • Article.findById(id) ищет документ по уникальному идентификатору MongoDB (_id).
  • Если статья не найдена, возвращается ошибка 404.
  • Если передан некорректный id (например, невалидный ObjectId), возвращается ошибка 400.

Создать новую статью

app.post('/articles', async (req, res) => {
  const { title, content } = req.body;
  if (!title || !content) {
    return res.status(400).json({ error: 'Требуются title и content' });
  }
  const newArticle = new Article({ title, content });
  await newArticle.save();
  res.status(201).json(newArticle);
});

Пояснения:

  • Ожидается, что в теле запроса будет JSON с полями title и content.
  • Если одно из полей отсутствует, возвращается ошибка 400.
  • Создаётся новый экземпляр модели и сохраняется в базе методом save().
  • В ответе возвращается созданная статья и статус 201 (создано).

Удалить статью

app.delete('/articles/:id', async (req, res) => {
  try {
    const result = await Article.findByIdAndDelete(req.params.id);
    if (!result) return res.status(404).json({ error: 'Статья не найдена' });
    res.status(204).send();
  } catch (err) {
    res.status(400).json({ error: 'Некорректный ID' });
  }
});

Пояснения:

  • Article.findByIdAndDelete(id) удаляет документ по id.
  • Если статья не найдена, возвращается ошибка 404.
  • Если id некорректный, возвращается ошибка 400.
  • При успешном удалении возвращается статус 204 (без содержимого).

5. Лучшие практики

  • Используйте переменные окружения для хранения строки подключения к базе данных (например, с помощью dotenv). Это повысит безопасность и упростит развертывание на разных серверах.
  • Разделяйте маршруты, модели и бизнес-логику по разным файлам и папкам. Это сделает проект более структурированным и удобным для поддержки.
  • Добавьте обработку ошибок и логирование. Используйте middleware для централизованной обработки ошибок и логируйте важные события (например, с помощью morgan).
  • Для production-окружения используйте облачные сервисы MongoDB (например, MongoDB Atlas), чтобы обеспечить отказоустойчивость и масштабируемость.
  • Валидация данных: даже если схема описана в Mongoose, дополнительно проверяйте входные данные на уровне API, чтобы избежать некорректных запросов.

Заключение

Express.js и MongoDB — отличная связка для создания современных, масштабируемых и гибких веб-приложений. Используйте Mongoose для удобной работы с данными, следуйте лучшим практикам и не забывайте о безопасности. Благодаря гибкости NoSQL и простоте Express вы сможете быстро реализовать API любой сложности, а подробная документация и большое сообщество помогут решить любые вопросы в процессе разработки.