正如你在问题中已经暗示的那样,这三个概念都非常相似,在很多情况下很难决定,这取决于你的偏好.但我可以概述一下这些区别:
在路由处理程序被调用后,拦截器可以在and之前访问响应/请求.
@UseInterceptors()
main.ts
分之app.useGlobalInterceptors()
null
to []
or wrap result in a response object: users
-> {users: users}
我喜欢注册比中间件更接近路由处理程序.但也有一些限制,例如,当在路由处理程序中发送带有库特定@Res()
对象的response
时,无法设置响应代码或使用拦截器更改响应,请参见docs.
仅在调用路由处理程序之前调用中间件.您可以访问响应对象,但没有路由处理程序的结果.它们基本上是express中间件功能.
main.ts
分之app.use()
index.html
,请参见this threadbody-parser
个或morgan
个中间件的注册非常灵活,例如:应用于除一条以外的所有路由等.但由于它们在模块中注册,当您查看其方法时,您可能没有意识到它适用于您的控制器.还可以利用所有的express中间件库.
异常过滤器在路由处理程序和拦截器之后调用.在做出回应之前,他们是最后一个做出改变的地方.
@UseFilters()
app.useGlobalFilters()
分index.html
.异常过滤器的基本用例是提供可理解的错误消息(隐藏技术细节).但也有其他创造性的使用方式:当您为一个单页应用程序提供服务时,通常所有路由都应该重定向到index.html
,但API的路由除外.在这里,你可以在NotFoundException
上重定向.一些人可能会觉得这很聪明,而另一些人则觉得这很无聊.你的 Select .;-)
Middleware -> Interceptors -> Route Handler -> Interceptors -> Exception Filter (if exception is thrown)
使用这三种方法,您可以注入其他依赖项(如服务,…)在他们的构造器中.