Промежуточное ПО между файлами

Я делаю новую чистую структуру приложения 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;

У меня также есть функция промежуточного программного обеспечения, которая обеспечивает доступ только для людей, вошедших в систему. Мой вопрос в том, где мне разместить промежуточное программное обеспечение, чтобы сделать его как можно более чистым? Меня беспокоит:

  • Промежуточное ПО нужно в разных местах
    • Маршруты уведомлений предназначены для только что вошедших в систему пользователей, поэтому они могут быть в server.js в функции app.use ().
    • Но маршруты статей более разнообразны, например все могут видеть статью, но только зарегистрированные пользователи могут ее комментировать. Поэтому у меня должно быть промежуточное ПО внутри файла маршрутизации.
  • Это хорошее место для использования глобальной функции (для промежуточного программного обеспечения)?
  • Действительно ли мне нужна одна и та же функция require (только для одного промежуточного программного обеспечения) во многих файлах маршрутизации?

Спасибо за все и любые советы или критику моего чистого решения.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
246
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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() в верхней части многих ваших модулей, обсуждался ранее. Вот некоторые из этих ссылок:

Node.js глобальный требует

Как правильно требовать файлы в другой файл

NodeJS требует, чтобы все модули были в одном файле, хорошая практика?

Как сделать модуль (например, bcrypt) доступным глобально в Express?

Хорошо, вы сказали именно то, что я знал. Конечно, я не могу использовать app.use (), иначе бы этого вопроса не было. Мой вопрос был больше похож на "действительно ли требуется в каждом модуле маршрутизации, и это нормально?" Я полагаю, вы как бы ответили на него, так что, если лучшего ответа не придет, я его принимаю.

Majkeee 12.05.2018 21:08

@Majkeee - Что ж, мой главный совет - изменить дизайн ваших маршрутизаторов, чтобы упростить указание аутентификации, чтобы вы не смешивали маршруты аутентификации и не-аутентификации в каждом маршрутизаторе ..

jfriend00 12.05.2018 21:09

@Majkeee - Я добавил в свой ответ несколько ссылок на вопрос об использовании того же require() во многих модулях node.js. Этот вопрос возникает регулярно. Короче говоря, одна из задач модулей - сделать их как можно более самоописательными и независимыми, и это приводит к небольшому повторению require(), которое обычно не используется в другом стиле программирования. Это нормально. Он отвечает за дизайн узлового модуля и цели этой модульной архитектуры. Вместо того, чтобы предполагать наличие некоторой глобальной среды, модуль просто определяет, от чего он зависит. Это хорошо.

jfriend00 12.05.2018 21:20

Хорошо, эти ссылки прояснили для меня это. Что касается вашего главного совета: я заметил это в первый раз, но проигнорировал, поскольку он противоречит чистому синтаксису и, возможно, даже интуитивному способу модуляции.

Majkeee 12.05.2018 22:04

Другие вопросы по теме