- Зачем связывать Node.js и MongoDB
- Что получится в конце
- Структура проекта
- Переменная окружения
- Пишем сервер
- Проверяем GET
- Проверяем POST
- Проверяем в Compass
- Что здесь важно для реального проекта
- Частые ошибки
- MongoServerSelectionError
- Cannot read properties of undefined
- В Compass пусто
- .env не читается
- Ответы на эти вопросы могут быть для вас полезными
- Нужно ли использовать Mongoose?
- Можно ли подключиться к Atlas?
- Почему мы не храним URI прямо в server.js?
- Как добавить поле телефона?
- Следующий шаг
- Что почитать дальше по MongoDB
Зачем связывать Node.js и MongoDB
Отдельно MongoDB выглядит как база с документами. Отдельно Node.js — как сервер, который умеет принимать запросы. Настоящий смысл появляется, когда они соединяются
Представь форму на сайте: человек оставляет имя, email и комментарий. Express принимает запрос, MongoDB сохраняет заявку, а ты потом смотришь ее в Compass
Это маленький, но уже настоящий backend-сценарий
Что получится в конце
Мы сделаем API:
GET /leads— получить список заявок;POST /leads— добавить новую заявку;- MongoDB collection
leads; - подключение через официальный MongoDB driver.
Для урока подойдет локальная MongoDB, Docker или Atlas. Главное — иметь connection string
Структура проекта
Создай папку:
mkdir node-mongo-leads
cd node-mongo-leads
npm init -y
Поставь пакеты:
npm install express mongodb dotenv
Создай файлы:
server.js
.env
.gitignore
В .gitignore:
node_modules
.env
Это важно: .env может содержать пароль к базе
Переменная окружения
В .env:
MONGODB_URI=mongodb://localhost:27017
PORT=3000
Если используешь Atlas, URI будет другим. Не вставляй его в публичную статью со своим паролем
Пишем сервер
Файл server.js:
require('dotenv').config();
const express = require('express');
const { MongoClient } = require('mongodb');
const app = express();
const port = process.env.PORT || 3000;
const client = new MongoClient(process.env.MONGODB_URI);
app.use(express.json());
let leads;
async function start() {
await client.connect();
const db = client.db('crm_demo');
leads = db.collection('leads');
app.listen(port, () => {
console.log(`API запущен: http://localhost:${port}`);
});
}
app.get('/leads', async (req, res) => {
const items = await leads.find().sort({ _id: -1 }).toArray();
res.json(items);
});
app.post('/leads', async (req, res) => {
const { name, email, source } = req.body;
if (!name || !email) {
return res.status(400).json({
error: 'name и email обязательны'
});
}
const lead = {
name,
email,
source: source || 'unknown',
status: 'new',
createdAt: new Date()
};
const result = await leads.insertOne(lead);
res.status(201).json({
id: result.insertedId,
...lead
});
});
start().catch((error) => {
console.error('Ошибка запуска API:', error);
process.exit(1);
});
Запуск:
node server.js
Проверяем GET
Открой:
http://localhost:3000/leads
Сначала может вернуться пустой массив:
[]
Это нормально: заявок еще нет
Проверяем POST
Отправь запрос через REST Client, Postman, Insomnia или curl:
curl -X POST http://localhost:3000/leads \
-H "Content-Type: application/json" \
-d '{"name":"Анна","email":"anna@example.com","source":"landing"}'
Ответ должен быть примерно таким:
{
"id": "...",
"name": "Анна",
"email": "anna@example.com",
"source": "landing",
"status": "new",
"createdAt": "..."
}
Теперь снова открой GET /leads. Заявка должна появиться в списке
Проверяем в Compass
Открой Compass, подключись к базе и найди:
crm_demo -> leads
Ты должен увидеть документ, который отправил через API
Вот здесь хорошо щелкает понимание: Express принял HTTP-запрос, MongoDB сохранила документ, Compass показал результат
Что здесь важно для реального проекта
В уроке мы сделали минимальный API. В реальном проекте нужно добавить:
- нормальную валидацию email;
- защиту от спама;
- rate limiting;
- авторизацию для просмотра заявок;
- обработку ошибок базы;
- логирование;
- CORS только для нужного домена.
Не публикуй такой endpoint в интернет без защиты. Иначе кто угодно сможет отправлять заявки в твою базу
Частые ошибки
MongoServerSelectionError
Часто означает, что база недоступна: сервер не запущен, Atlas не пускает IP, неправильный URI
Cannot read properties of undefined
Проверь, успело ли приложение подключиться к базе до обработки запросов. В нашем примере сервер начинает слушать порт после client.connect()
В Compass пусто
Проверь, что приложение пишет в ту же базу crm_demo и коллекцию leads, которую ты открыл
.env не читается
Проверь, что в начале файла есть:
require('dotenv').config();
и что .env лежит в корне проекта
Ответы на эти вопросы могут быть для вас полезными
Нужно ли использовать Mongoose?
Для первого урока нет. Официальный драйвер MongoDB проще показывает, что происходит. Mongoose полезен позже, когда нужна схема, модели и валидация на уровне приложения
Можно ли подключиться к Atlas?
Да. Замени MONGODB_URI на строку Atlas, проверь database user, пароль и Network Access
Почему мы не храним URI прямо в server.js?
Потому что строка подключения может содержать пароль. Такие данные должны быть в переменных окружения
Как добавить поле телефона?
Добавь phone в тело запроса, проверь его в обработчике и сохрани в объект lead
Следующий шаг
Добавь HTML-форму на отдельной странице и отправляй заявку через fetch. Тогда получится полный путь: форма на сайте -> Node.js API -> MongoDB
Что почитать дальше по MongoDB
Если вы собираете тему по шагам, рядом лучше открыть:
- MongoDB простыми словами: создаем первую коллекцию — проверить, что именно сохраняется в коллекции leads.
- MongoDB Atlas: облачная база для первого проекта — перенести учебный API на облачную базу.
- MongoDB в Docker Compose: локальная база без установки в систему — запустить базу рядом с проектом через Docker Compose.
- MongoDB Compass: подключение и первая коллекция без командной строки — посмотреть созданные заявки в визуальном интерфейсе.



