Я делаю новую чистую структуру приложения nodejs (экспресс).
У меня есть папка моделей со схемами мангуста, папка маршрутов для маршрутизации, папка контроллеров (со всей логикой) и основной файл server.js со следующим:
require('./models/notifications');
require('./models/articles');
const
notificationRouter = require('./routes/notifications'),
articleRouter = require('./routes/articles');
app.use('/notifications', notificationRouter);
app.use('/articles', articleRouter);
Файл маршруты / notifications.js
const
router = require('express').Router(),
controller = require('../controllers/notifications');
router.route('/')
.get(controller.getAll)
.post(controller.create);
router.route('/:id')
.put(controller.seen);
module.exports = router;
Файл маршруты / article.js
const
router = require('express').Router(),
controller = require('../controllers/articles');
router.route('/:articleId/comments')
.post(controller.insertComment);
module.exports = router;
У меня также есть функция промежуточного программного обеспечения, которая обеспечивает доступ только для людей, вошедших в систему. Мой вопрос в том, где мне разместить промежуточное программное обеспечение, чтобы сделать его как можно более чистым? Меня беспокоит:
Спасибо за все и любые советы или критику моего чистого решения.





I also have a middleware function that ensures access only for people logged in. My question is, where should I put the middleware to make it as clean as possible?
Самая простая схема - определить несколько маршрутов, которые не требуют аутентификации, после чего вы должны выполнить app.use() для вашего промежуточного программного обеспечения аутентификации, поскольку оно будет применяться ко всем маршрутам, которые вы определяете после этого.
But article routes have more variety, e.g. everybody can see article, but just logged in users can comment it. So I have to have the middleware inside routing file.
Если у вас есть маршрутизаторы, требующие аутентификации на некоторых маршрутах, а не на других в этом маршрутизаторе, значит, вы создали проект, не позволяющий простейшим способом проверить аутентификацию. Чтобы это работало, вам нужно будет добавить проверку аутентификации с помощью router.use() для любого маршрутизатора, у которого есть маршруты, требующие аутентификации. Опять же, вы сначала определяете маршруты, для которых не требуется аутентификация, затем выполняете router.use() с вашим промежуточным программным обеспечением для аутентификации, а затем определяете маршруты, для которых требуется аутентификация.
Do I really need same require function (of just one middleware) in many routing files?
Это зависит от вашего дизайна. Если ваш дизайн требует, чтобы вы добавляли промежуточное ПО для аутентификации на каждый маршрутизатор, тогда вам потребуется это промежуточное ПО для каждого отдельного файла маршрутизатора. Но если вы проектируете свои маршрутизаторы так, чтобы маршрутизаторы не были сочетанием маршрутов с аутентификацией и без аутентификации, тогда вы, вероятно, можете обрабатывать промежуточное программное обеспечение аутентификации на более высоком уровне, сначала определив маршрутизаторы без аутентификации, а затем добавив промежуточное ПО аутентификации с помощью app.use() затем определите ваши маршрутизаторы, требующие аутентификации. Сложность обработки аутентификации полностью зависит от того, как вы организуете маршруты, требующие аутентификации. Если вы смешиваете их с маршрутами, не требующими аутентификации, то код определенно будет более подробным, чтобы правильно определить аутентификацию. Если вы отделите аутентификацию от маршрутов без аутентификации, вы, вероятно, сможете добавить промежуточное ПО аутентификации на более высоком уровне и, возможно, только один раз.
Is this good place to use global function (for the middleware)?
Нет. Нет ничего страшного в том, чтобы добавить один оператор require() в верхнюю часть модуля, чтобы получить промежуточное программное обеспечение, когда вам нужно, и тогда вы сможете избежать использования глобальных переменных.
Общий вопрос о том, как избежать использования require() в верхней части многих ваших модулей, обсуждался ранее. Вот некоторые из этих ссылок:
Как правильно требовать файлы в другой файл
NodeJS требует, чтобы все модули были в одном файле, хорошая практика?
Как сделать модуль (например, bcrypt) доступным глобально в Express?
@Majkeee - Что ж, мой главный совет - изменить дизайн ваших маршрутизаторов, чтобы упростить указание аутентификации, чтобы вы не смешивали маршруты аутентификации и не-аутентификации в каждом маршрутизаторе ..
@Majkeee - Я добавил в свой ответ несколько ссылок на вопрос об использовании того же require() во многих модулях node.js. Этот вопрос возникает регулярно. Короче говоря, одна из задач модулей - сделать их как можно более самоописательными и независимыми, и это приводит к небольшому повторению require(), которое обычно не используется в другом стиле программирования. Это нормально. Он отвечает за дизайн узлового модуля и цели этой модульной архитектуры. Вместо того, чтобы предполагать наличие некоторой глобальной среды, модуль просто определяет, от чего он зависит. Это хорошо.
Хорошо, эти ссылки прояснили для меня это. Что касается вашего главного совета: я заметил это в первый раз, но проигнорировал, поскольку он противоречит чистому синтаксису и, возможно, даже интуитивному способу модуляции.
Хорошо, вы сказали именно то, что я знал. Конечно, я не могу использовать app.use (), иначе бы этого вопроса не было. Мой вопрос был больше похож на "действительно ли требуется в каждом модуле маршрутизации, и это нормально?" Я полагаю, вы как бы ответили на него, так что, если лучшего ответа не придет, я его принимаю.