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

谢谢

推荐答案

正如你在问题中已经暗示的那样,这三个概念都非常相似,在很多情况下很难决定,这取决于你的偏好.但我可以概述一下这些区别:

Interceptors

在路由处理程序被调用后,拦截器可以在and之前访问响应/请求.

登记

  • 直接在控制器类中,控制器或方法作用域为@UseInterceptors()
  • 在全局,main.ts分之app.useGlobalInterceptors()

例子

  • LoggingInterceptor:在路由处理程序之前请求,然后请求结果.这需要一定的时间.
  • ResultMapping: Transform null to [] or wrap result in a response object: users -> {users: users}

结论

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

Middleware

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

登记

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

例子

  • FrontendMiddleware:将除API之外的所有路由重定向到index.html,请参见this thread
  • 您可以使用任何存在的express中间件.图书馆共有lots个,例如body-parser个或morgan

结论

中间件的注册非常灵活,例如:应用于除一条以外的所有路由等.但由于它们在模块中注册,当您查看其方法时,您可能没有意识到它适用于您的控制器.还可以利用所有的express中间件库.

Exception Filters

异常过滤器在路由处理程序和拦截器之后调用.在做出回应之前,他们是最后一个做出改变的地方.

登记

  • 直接在控制器类中,控制器或方法作用域为@UseFilters()
  • 全球app.useGlobalFilters()

例子

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

结论

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


So the execution order is:

Middleware -> Interceptors -> Route Handler -> Interceptors -> Exception Filter (if exception is thrown)

使用这三种方法,您可以注入其他依赖项(如服务,…)在他们的构造器中.

Node.js相关问答推荐

如何使用Express正确跟踪服务器应用程序上的所有传出的Node.js请求

使用NodeJS在S3上传文件时的格式问题

在导入时未找到Pupeteer-PAGE-Proxy包

使用Node.js中的";类型";:";模块";不导入文件

带有apache Couch-db和Nano的推荐引擎:过滤特定用户的视图

未显示NPM版本

通过 Node js 中的 TBA 执行 netsuite REST upsert 操作出现 401 错误

遇到 - TypeError:try 使用 Express(Node.js) 从 JSON 文件访问数据时无法读取未定义的属性(读取帖子)

使用更新版本仍然找到包@angular/fire但不支持原理图

找不到模块bcryptjs

在对象数组中的数组中嵌套 $lookup - Mongodb

如何解决 npm install react-select failure with error : An unknown git error occurred, git@github.com :Permission denied (publickey)

在 Express.js 中迭代子文档数组

我怎样才能让`git`失败而不是要求提供凭据

如何让我的 Next.js 应用在运行 ubuntu-latest 的 Azure 应用服务中启动?

npm package.json 操作系统特定脚本

Node应用程序中相同npm包的两个版本

什么是 JavaScript 中的REPL?

处理快速异步中间件中的错误

Node.js 中的 Streams3 是什么,它与 Streams2 有何不同?