Как вы уже подразумевали в своем вопросе, все три понятия очень похожи, и во многих случаях это трудно решить, и сводится к вашим предпочтениям.Но я могу дать обзор различий:
Перехватчики имеют доступ к ответу / запросу до и после вызова обработчика маршрута.
Регистрация
- Непосредственно в классе контроллера с
@UseInterceptors()
областью действия контроллера или метода - Глобально с
app.useGlobalInterceptors()
в main.ts
Примеры
- LoggingInterceptor: Запрос перед обработчиком маршрута и после его результата.Время, которое требуется.
- ResultMapping: Преобразуйте
null
в []
или оберните результат в объект ответа: users
-> {users: users}
Заключение
Мне нравится, что регистрация ближе к обработчикам маршрутов по сравнению с промежуточным ПО.Но есть некоторые ограничения, например, вы не можете установить код ответа и не можете использовать перехватчики, когда вы используете response
с @Res()
объектами в вашем обработчике маршрута.
Промежуточное программное обеспечение вызывается только перед вызовом обработчика маршрута.У вас есть доступ к объекту ответа, но у вас нет результата обработчика маршрута.В основном это экспресс-функции промежуточного программного обеспечения.
Регистрация
- В модуле очень гибкий способ выбора соответствующих маршрутов (с подстановочными знаками, методом ...)
- Глобально с
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
.Некоторые могут найти это умным другим взломанным.Твой выбор.; -)
Таким образом, порядок выполнения:
Промежуточное программное обеспечение -> Перехватчики -> Обработчик маршрута -> Перехватчики -> Фильтр исключения (если выбрасывается исключение)
Со всеми тремя из них вы можете добавить другие зависимости (например, службы, ...) в их конструктор.