gpt4 book ai didi

node.js - Nest.js 中的拦截器、中间件和过滤器之间有什么区别?

转载 作者:搜寻专家 更新时间:2023-10-30 20:38:42 26 4
gpt4 key购买 nike

Nest.js 框架中的拦截器、过滤器和中间件有什么区别?什么时候应该使用其中一个并优先于另一个?

谢谢

最佳答案

正如您已经在问题中暗示的那样,这三个概念都是非常相似的概念,在很多情况下很难做出决定,这取决于您的喜好。但我可以概述一下差异:

Interceptors

拦截器可以在调用路由处理程序之前访问响应/请求。

注册

  • 直接在 Controller 类中使用 @UseInterceptors() controller- or method-scoped
  • main.ts 中全局使用 app.useGlobalInterceptors()

例子

  • LoggingInterceptor:在路由处理程序之前请求并在其结果之后请求。测量所需的时间。
  • ResultMapping:将 null 转换为 [] 或将结果包装在响应对象中:users -> {users: users}

结论

我喜欢注册比中间件更接近路由处理程序。但是有一些限制,例如,当您发送带有库特定的 @Res() 对象的 response 时,您不能设置响应代码或更改拦截器的响应在您的路线处理程序中,请参阅 docs .

Middleware

中间件仅在调用路由处理程序之前被调用。您可以访问响应对象,但您没有路由处理程序的结果。它们基本上是表达中间件功能。

注册

  • 在模块中,选择相关路由的方式非常灵活(使用通配符,按方法,...)
  • main.ts 中全局使用 app.use()

例子

  • FrontendMiddleware:将除 API 之外的所有路由重定向到 index.html,参见 this thread
  • 您可以使用现有的任何快速中间件。有很多库,例如body-parsermorgan

结论

中间件的注册非常灵活,例如:应用到除一个之外的所有路由等。但是由于它们是在模块中注册的,所以当您查看它的方法时,您可能没有意识到它适用于您的 Controller 。您还可以利用现有的所有 express 中间件库,这也很棒。

Exception Filters

异常过滤器在路由处理程序和拦截器之后调用。它们是响应发出前最后进行更改的地方。

注册

  • 直接在 Controller 类中使用 @UseFilters() controller- or method-scoped
  • 全局 app.useGlobalFilters() 在你的 main.ts

例子

  • UnauthorizedFilter:映射到用户易于理解的消息
  • NotFoundFilter:将所有未找到的路由(不是您的 api 的一部分)映射到您的 index.html

结论

异常过滤器的基本用例是提供可理解的错误消息(隐藏技术细节)。但也有其他创造性的使用方式:当您提供单页应用程序时,通常所有路由都应重定向到 index.html,但您的 API 路由除外。在这里,您可以在 NotFoundException 上重定向。有些人可能会发现这个聪明的其他人 hacky。你的选择。 ;-)


所以执行顺序是:

中间件 -> 拦截器 -> 路由处理程序 -> 拦截器 -> 异常过滤器(如果抛出异常)

有了这三个,您可以在它们的构造函数中注入(inject)其他依赖项(如服务等)。

关于node.js - Nest.js 中的拦截器、中间件和过滤器之间有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54863655/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com