В чем разница между Interceptor и Middleware против Filter в Nest.js? - PullRequest
0 голосов
/ 25 февраля 2019

В чем разница между Interceptor, Filter и Middleware в инфраструктуре Nest.js?Когда один из них следует использовать и отдавать предпочтение другому?

Спасибо

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

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

Перехватчики

Перехватчики имеют доступ к ответу / запросу до и после вызова обработчика маршрута.

Регистрация

  • Непосредственно в классе контроллера с @UseInterceptors() областью действия контроллера или метода
  • Глобально с app.useGlobalInterceptors() в main.ts

Примеры

  • LoggingInterceptor: Запрос перед обработчиком маршрута и после его результата.Время, которое требуется.
  • ResultMapping: Преобразуйте null в [] или оберните результат в объект ответа: users -> {users: users}

Заключение

Мне нравится, что регистрация ближе к обработчикам маршрутов по сравнению с промежуточным ПО.Но есть некоторые ограничения, например, вы не можете установить код ответа и не можете использовать перехватчики, когда вы используете response с @Res() объектами в вашем обработчике маршрута.

Middleware

Промежуточное программное обеспечение вызывается только перед вызовом обработчика маршрута.У вас есть доступ к объекту ответа, но у вас нет результата обработчика маршрута.В основном это экспресс-функции промежуточного программного обеспечения.

Регистрация

  • В модуле очень гибкий способ выбора соответствующих маршрутов (с подстановочными знаками, методом ...)
  • Глобально с app.use() in main.ts

Примеры

  • FrontendMiddleware: перенаправить все маршруты, кроме API, на index.html, см. article
  • Вы можете использовать любое промежуточное программное обеспечение Express, которое там есть.Существует лотов библиотек, например, body-parser или morgan

Заключение

РегистрацияПО промежуточного ПО очень гибкое, например: применяется ко всем маршрутам, кроме одного и т. д. Но поскольку они зарегистрированы в модуле, вы можете не осознавать, что это применимо к вашему контроллеру, когда вы смотрите на его методы.Также замечательно, что вы можете использовать все существующие библиотеки промежуточного программного обеспечения.

Фильтры исключений

Фильтры исключений вызываются после обработчика маршрута и послеперехватчики.Они являются последним местом для внесения изменений до того, как отклик исчезнет.

Регистрация

  • Непосредственно в классе контроллера с @UseFilters() контроллером или областью применения метода
  • Глобально app.useGlobalFilters() в вашем main.ts

Примеры

  • UnauthorizedFilter: отображение в простое для понимания сообщение для пользователя
  • NotFoundFilter: Mapвсе маршруты, которые не найдены (не являются частью вашего API) к вашему index.html.

Заключение

В базовом сценарии использования фильтров исключений даются понятные сообщения об ошибках (скрытие техническихподробности).Но есть и другие творческие способы использования: когда вы обслуживаете одностраничное приложение, обычно все маршруты должны перенаправляться на index.html, кроме маршрутов вашего API.Здесь вы можете перенаправить на NotFoundException.Некоторые могут найти это умным другим взломанным.Твой выбор.; -)


Таким образом, порядок выполнения:

Промежуточное программное обеспечение -> Перехватчики -> Обработчик маршрута -> Перехватчики -> Фильтр исключения (если выбрасывается исключение)

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

0 голосов
/ 25 февраля 2019

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

Определенно есть некоторые совпадения, поскольку Middleware - это гибкий способ составления любого веб-приложения, но в большей степениобщая концепция (создание стека функций для построения конвейера).Другие - это специфические для Nest концепции, и поэтому они более естественным образом связаны с такими вещами, как Dependency Injection.

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

Перехватчикидействительно аккуратный, потому что они могут преобразовывать как входящие, так и исходящие данные вашего API.Они дают вам возможность изменять то, что оригинальный обработчик возвратил бы, используя наблюдаемые потоки.Это то, что вам, вероятно, потребуется реализовать с помощью двух промежуточных программ (по обе стороны от обработчика).

Используйте Pipes, если вы хотите преобразовать данные, поступающие в обработчик.

Используйте Перехватчики, когда требуется двунаправленное преобразование.

Используйте промежуточное ПО, когда вы хотите приблизиться к традиционному (например, Express) способу создания вашего веб-приложения или когда вы хотите более широко применять функциональность сразу ко многим обработчикам (в вашем коде меньше декораторов)).

...