Короткий ответ: маршрут в 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. Для соседних задач пригодятся эти разборы:
- Как в Node.js Express отдать файл по ссылке: sendFile и static
- Как достать данные из модуля с базой в Node.js Express
- Как запустить сервер Node.js: простой HTTP-сервер и Express
- Как получить содержимое директории и поддиректорий в Node.js Express



