
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 любой сложности, а подробная документация и большое сообщество помогут решить любые вопросы в процессе разработки.