我正在Nest中编写RESTful API,到目前为止,我已经开始使用并喜欢它。但是,我正在努力寻找一种干净的模式来处理GET路由的204 No Content响应。有什么建议吗?
令我感到有些惊讶的是,如果GET控制器方法返回的对象为空,则框架中没有任何东西可以返回204-如果存在,我还没有找到。如果确实没有,我也想知道这是否值得在GitHub上进行功能请求。
我尝试了以下操作:
@Response()
作为Controller方法参数公开Express res属性,如果响应为空,则使用res.sendStatus(204)
。但是,这也需要我手动发送200个响应,而我仍然想依靠该框架来处理请求-响应周期并保持控制器方法尽可能整洁。NoContentException
。尽管为成功的响应代码抛出异常很奇怪,但是我认为这是我将继续进行的方式,因为异常过滤器是我编写的代码中执行的最后一件事。答案 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响应的想法
如@kim-kern answer中所述,在Express.js编程中直接实现或将拦截器作为中间件插件构建到nestjs框架用法中,这是可能且可行的。
但是,在api设计级别,它不是必需的功能,因为一个api应该理想地设计为一个成功响应,这意味着只有一个成功代码可用于一个端点。从这个角度来看,状态码注释是可以接受的。
答案 2 :(得分:0)
看这个example:
@Post()
@HttpCode(204)
create() {
return 'This action adds a new cat';
}
这就是您需要做的。它会为您返回204。