Я пытаюсь понять, как структурировать корпоративное приложение с помощью Node/Express/Mongo (фактически используя стек MEAN).
После чтения 2 книг и некоторых поисковых запросов (включая похожие вопросы StackOverflow) я не смог найти хороший пример структурирования больших приложений с помощью Express. Все источники, которые я прочитал, предлагают разделить приложение следующими объектами:
- маршруты
- Контроллеры
- Модели
Но основная проблема, которую я вижу в этой структуре, заключается в том, что контроллеры похожи на объекты-боги, они знают о req
, res
объектах, ответственных за проверку и включающих бизнес-логику.
С другой стороны, маршруты мне кажутся слишком сложными, потому что все, что они делают, - это сопоставление конечных точек (путей) с методами контроллера.
У меня есть фона Scala/Java, поэтому у меня есть привычка разделять всю логику на 3 уровня - контроллер/сервис/дао.
Для меня идеальны следующие утверждения:
-
Контроллеры отвечают только за взаимодействие с WEB-частью, т.е. сортировку/разборку, некоторую простую проверку (требуется, мин, макс, регулярное выражение электронной почты и т.д.);
-
Уровень сервиса (который на самом деле я пропустил в приложениях NodeJS/Express) отвечает только за бизнес-логику, некоторую проверку бизнеса. Уровень сервиса ничего не знает о WEB-части (т.е. Они могут быть вызваны из другого места приложения не только из веб-контекста);
-
Что касается уровня DAO, для меня все понятно. Модели Mongoose на самом деле DAO, поэтому для меня это самая ясная вещь.
Я думаю, что примеры, которые я видел, очень просты, и они показывают только концепции Node/Express, но я хочу посмотреть на какой-то реальный пример, в котором участвует большая часть бизнес-логики/валидации.
ИЗМЕНИТЬ:
Мне еще не ясно, нет ли объектов DTO. Рассмотрим этот пример:
const mongoose = require('mongoose');
const Article = mongoose.model('Article');
exports.create = function(req, res) {
// Create a new article object
const article = new Article(req.body);
// saving article and other code
}
Здесь объект JSON из req.body
передается как параметр для создания документа Mongo. Мне плохо пахнет. Я хотел бы работать с конкретными классами, а не с сырым JSON
Спасибо.