NESTJS - 对同一路由使用 HEAD Http 请求类型和 GET

问题描述 投票:0回答:1

根据设计,在我们的 RESTful api 中,我们使用 HEAD 来检查实体是否存在。我最近遇到了使用 NestJS 以及使用具有相同路由的 HEAD 和 GET 的 Http 请求类型的问题。由于某种原因,当客户端向 API 发出 http HEAD 请求(例如 HEAD - /api/test)时,它将路由到代码的 GET 部分控制器。经过一番排查,似乎与方法在控制器中的位置有关。如果将控制器代码的 HEAD 部分放在 GET 之后,请求将拦截到 GET 请求。如果你把它放在后面,它将按预期工作。不知道为什么,但很高兴知道

代码片段:

// HEAD must be before GET for NestJS controller with the same route
@Head(':id')  // check for the existence of an entity
  async hasOne(@Res() response, @Param('id') id): Promise<any> {

   // do something
  }

  @Get(':id') // Get a single entity
  getOne(@Param('id') id): Promise<any> {

   // do something
  }

我们正在使用 NestJS 10.4.4

nestjs
1个回答
0
投票

这是一个 Express 问题,在版本 4.* 中引入,并且从未修复,因为它“破坏了东西”。 https://github.com/expressjs/express/issues/2116

Express 在定义 API 路由时使用“先到先得”的规则,因此您的代码完全按照您观察到的方式执行:get 路由处理 head 请求(https://github.com/expressjs/expressjs.com/issues /748)除非在 get 之前定义了特定的头路由。

© www.soinside.com 2019 - 2024. All rights reserved.