在NestJS中处理204无内容响应的最佳方法是什么?

时间:2019-01-03 17:01:21

标签: typescript rest api-design nestjs

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

令我感到有些惊讶的是,如果GET控制器方法返回的对象为空,则框架中没有任何东西可以返回204-如果存在,我还没有找到。如果确实没有,我也想知道这是否值得在GitHub上进行功能请求。

我尝试了以下操作:

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

3 个答案:

答案 0 :(得分:0)

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

  

通常,您的状态码不是静态的,而是取决于各种因素。   在这种情况下,您可以使用特定于库的响应(使用   <ul id="theList"> <li>one</li> <li>two</li> <li>three</li> </ul> <button onclick="addLI()"> add </button>)对象(如果出现错误,则抛出异常)。

您也不能只在@Res()中设置响应代码而不发送它(而不是Interceptor),因为正如Kamil在此thread中所说的那样:

  

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

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

由于其他人似乎都拥有exact same problem,因此提出功能请求可能是一个好主意。 :-)

答案 1 :(得分:0)

  • 最初,对于产生204 No Content响应的实践,它在position of introducing nestjs status code annotation feature的官方文档中已经提到。
  • 关于通过检查响应内容是否为空来生成204响应的想法

    @kim-kern answer中所述,在Express.js编程中直接实现或将拦截器作为中间件插件构建到nestjs框架用法中,这是可能且可行的。

    但是,在api设计级别,它不是必需的功能,因为一个api应该理想​​地设计为一个成功响应,这意味着只有一个成功代码可用于一个端点。从这个角度来看,状态码注释是可以接受的。

答案 2 :(得分:0)

看这个example

@Post()
@HttpCode(204)
create() {
  return 'This action adds a new cat';
}

这就是您需要做的。它会为您返回204。