Как правильно настроить маршрут в Node.js, Express и Mongoose

Короткий ответ: маршрут в Express должен принимать HTTP-запрос, вызывать функцию с логикой, дождаться результата Mongoose и вернуть ответ клиенту. Хорошая структура для новичка: отдельно routes, отдельно controllers, отдельно models. Тогда код не превращается в одну длинную простыню внутри server.js

Запрос «как правильно настроить маршрут в приложении node js express mongoose» обычно появляется, когда человек уже подключил Express и MongoDB, но не понимает, где должна жить логика: в app.get, в модели, в отдельном файле или прямо рядом с подключением к базе. Для учебного проекта можно начать просто, но границы лучше поставить сразу

Базовая структура проекта

Пример папок

project/
  server.js
  models/
    Task.js
  controllers/
    taskController.js
  routes/
    taskRoutes.js

server.js запускает приложение и подключает маршруты. routes описывает адрес. controllers содержит обработчики. models описывает данные Mongoose

Модель Mongoose

Файл models/Task.js

const mongoose = require("mongoose");

const taskSchema = new mongoose.Schema({
  title: {
    type: String,
    required: true
  },
  completed: {
    type: Boolean,
    default: false
  }
});

module.exports = mongoose.model("Task", taskSchema);

Модель отвечает за форму документа в MongoDB. В маршруте лучше не описывать схему заново

Контроллер

const Task = require("../models/Task");

async function getTasks(request, response, next) {
  try {
    const tasks = await Task.find().sort({ _id: -1 });
    response.json(tasks);
  } catch (error) {
    next(error);
  }
}

async function createTask(request, response, next) {
  try {
    const task = await Task.create({
      title: request.body.title
    });

    response.status(201).json(task);
  } catch (error) {
    next(error);
  }
}

module.exports = {
  getTasks,
  createTask
};

Контроллер не должен знать, на каком точном адрес он висит. Он просто выполняет задачу: получить список или создать запись

Маршрут Express

const express = require("express");
const { getTasks, createTask } = require("../controllers/taskController");

const router = express.Router();

router.get("/", getTasks);
router.post("/", createTask);

module.exports = router;

Здесь видно главное: адрес /tasks будет подключен в server.js, а внутри роутера / означает корень этого раздела

Подключение в server.js

const express = require("express");
const mongoose = require("mongoose");
const taskRoutes = require("./routes/taskRoutes");

const app = express();

app.use(express.json());
app.use("/tasks", taskRoutes);

app.use((error, request, response, next) => {
  console.error(error);
  response.status(500).json({ message: "Ошибка сервера" });
});

async function start() {
  await mongoose.connect("mongodb://127.0.0.1:27017/tasks_demo");

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

start();

Теперь GET /tasks вернет список задач, а POST /tasks создаст новую задачу

Как проверить маршрут

Проверка списка

curl http://localhost:3000/tasks

Проверка создания

curl -X POST http://localhost:3000/tasks \
  -H "Content-Type: application/json" \
  -d '{"title":"Разобраться с маршрутами Express"}'

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

Почему не стоит держать все в app.post

Для одного урока можно написать все прямо в server.js. Но как только появляется несколько маршрутов, код становится шумным: подключение к базе, схемы, обработчики, ошибки и запуск сервера лежат в одном файле. Разделение на route/controller/model делает проект понятнее и не требует сложной архитектуры

Мини-практика

Добавьте маршрут GET /tasks/:id, который возвращает одну задачу по id. Используйте Task.findById(request.params.id) и обработайте случай, когда задача не найдена

if (!task) {
  return response.status(404).json({ message: "Задача не найдена" });
}

Частые ошибки

request.body пустой Проверьте, что подключили app.use(express.json()) до маршрутов

Mongoose не подключился Убедитесь, что MongoDB запущена и строка подключения правильная

Маршрут не срабатывает Проверьте, что app.use("/tasks", taskRoutes) стоит до обработчика ошибок

Ошибка не возвращается клиенту В async-контроллере передавайте ошибку в next(error) или обрабатывайте ее явно

Что почитать дальше по Node.js

Если нужен общий маршрут по теме, откройте рубрику Node.js. Для соседних задач пригодятся эти разборы:

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

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