Node.js + Express: маршруты против контроллера

100

Новичок в Node.js и Express, я пытаюсь понять, что две кажущиеся пересекающиеся концепции - маршруты и контроллер.

Я видел примеры, которые просто делают app.js + routes / *, кажется, этого достаточно для маршрутизации различных необходимых запросов.

Однако я также вижу, как люди говорят об использовании контроллеров, и некоторые из них подразумевают более формальную модель MVC (???).

Было бы здорово, если бы кто-нибудь помог мне раскрыть эту тайну, и если у вас есть хороший пример настройки контроллера в среде Node.js + Express, это будет здорово!

Спасибо,

user1462192
источник

Ответы:

129

Одна из замечательных особенностей Express (и Node в целом) заключается в том, что он не навязывает вам много мнений; один из недостатков - это не навязывает вам никаких мнений. Таким образом, вы можете (и обязаны!) Создавать любые подобные мнения (шаблоны) самостоятельно.

В случае Express вы определенно можете использовать шаблон MVC, и обработчик маршрута, безусловно, может выполнять роль контроллера, если вы того пожелаете, но вы должны настроить его таким образом. Отличный пример можно найти в папке Express examples с именем mvc. Если вы посмотрите lib/boot.js, вы увидите, как они настроили пример, чтобы требовать каждый файл в controllersкаталоге и генерировать маршруты Express на лету в зависимости от имени методов, созданных на контроллерах.

Мишель Тилли
источник
2
Первый абзац этого довольно умного ответа также дает хорошее объяснение / различие между двумя терминами.
Фрэнк Нок
1

У вас может быть просто папка маршрутов или и то, и другое. Например, некоторые устанавливают маршруты / пути (например, / user /: id) и подключают их к Get, Post, Put / Update, Delete и т. Д., А затем в папке маршрутов:

const subController = require('./../controllers/subController');

Router.use('/subs/:id);

Router
 .route('subs/:id');
 .get(
 subController.getSub
 .patch(
 subController.updateSub
 );

Затем в папке контроллеров:

exports.getSub = (req, res, next) => {
  req.params.id = req.users.id;
};

Просто чтобы что-нибудь сделать. Я делал проекты без папки контроллеров и поместил всю логику в одно место.

К. Джохари
источник