在 NestJS 中处理 204 No Content 响应的最佳方法是什么?

Eri*_*ric 6 rest api-design typescript nestjs

我正在 Nest 中编写一个 RESTful API,我最近开始使用它并且到目前为止我很喜欢。但是,我正在努力寻找一种干净的模式来处理我的 GET 路由的 204 No Content 响应。有什么建议吗?

我有点惊讶,如果 GET 控制器方法返回的对象为空,框架中没有内置用于返回 204 的内容——如果有,我还没有找到它。如果真的没有,我也想知道这是否值得在 GitHub 上提出功能请求。

我尝试了以下方法:

  • 将 Express res 属性@Response()用作 Controller 方法参数,然后res.sendStatus(204)在响应为空时使用。但是,这也需要我手动发送 200 个响应,而我仍然希望依靠框架来处理请求-响应周期并尽可能保持我的控制器方法干净。
  • 研究使用拦截器检查响应对象是否为空,然后将 204 状态代码写入那里的响应。我真的不想这样做,因为状态代码可能会因异常过滤器而改变。
  • 使用中间件编写响应代码,但我的中间件在路由到控制器之前执行,之后我需要检查响应是否为空。res.on('send') 似乎也没有在出路时拦截响应。
  • NoContentException为我的异常过滤器抛出一个自定义来处理。尽管为成功的响应代码抛出异常很奇怪,但我认为这是我同时进行的方式,因为我的异常过滤器是我编写的代码中将执行的最后一件事。

Ved*_*ic. 16

看这个例子

@Post()
@HttpCode(204)
create() {
  return 'This action adds a new cat';
}
Run Code Online (Sandbox Code Playgroud)

这就是您需要做的全部。它为你返回 204。

  • HTTP 状态代码有一个枚举:HttpStatus。所以你可以这样做:@HttpCode(HttpStatus.NO_CONTENT) (10认同)

Kim*_*ern 5

更新 v6.1.0

从 v6.1.0 开始,可以在拦截器中设置响应代码,请参阅此PR


过时的答案

不幸的是,这似乎还不可能。在文档中它说:

通常,您的状态代码不是静态的,而是取决于各种因素。在这种情况下,您可以使用特定于库的响应(使用 注入 @Res())对象(或者,如果出现错误,则抛出异常)。

您也不能只在Interceptor不发送(而不是sendStatus)的情况下设置响应代码,因为正如 Kamil 在此线程中所说:

全局响应控制器的逻辑是在通过网络发送最终结果之前执行的最后一步(这是默认状态代码进入的地方)。

因此,如果您(可以理解)不想@Res在每个控制器中使用, anExceptionFilter似乎是最好的选择,尽管它感觉并不完全正确。

由于其他人似乎有完全相同的问题,因此功能请求可能是一个好主意。:-)