Node.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

Если вы собираете тему по шагам, рядом лучше открыть:

Оцените статью
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x