NestJS设置204状态码失效,API仍返回200问题求助
解决NestJS API无法返回204 No Content响应的问题
我开发了一个需要返回204 No Content响应的NestJS API,设置了状态码后仍返回200 OK,相关代码如下:
import { Controller, Get, Header, HttpStatus, Req, Res } from '@nestjs/common'; import { Response } from 'express'; @Get("mediation-get-api") @Header('Access-Control-Allow-Origin', "*") @Header("X-Frame-Options", "SAMEORIGIN always") async getMediationAPI(@Req() _request, @Res() _res) { let APIResponse: any APIResponse = await this.ServiceObj.getResult(_request) console.log("APIResponse point") console.log(APIResponse) if (APIResponse != undefined) { console.log("Not Empty Response") _res.json(APIResponse.data).status(HttpStatus.OK) _res.statusCode = HttpStatus.OK _res.statusMessage = APIResponse.statusText } else { console.log("Empty Response") _res.json({}).status(HttpStatus.NO_CONTENT) _res.statusCode = HttpStatus.NO_CONTENT // _res.statusMessage = "No Content" } console.log("Response") console.log(_res) return _res }
问题原因
- 204响应规则冲突:204 No Content响应明确要求不能包含任何响应体,但你在else分支中调用
_res.json({})发送了空对象,客户端会因此自动将状态码转为200 OK。 - 链式调用顺序错误:
_res.json().status()是先发送响应内容再设置状态码,但此时响应已经完成发送,后续的状态码修改不会生效。
解决方案
修正后的代码(基于Express响应对象)
import { Controller, Get, Header, HttpStatus, Req, Res } from '@nestjs/common'; import { Response } from 'express'; @Get("mediation-get-api") @Header('Access-Control-Allow-Origin', "*") @Header("X-Frame-Options", "SAMEORIGIN always") async getMediationAPI(@Req() _request, @Res() _res) { const APIResponse = await this.ServiceObj.getResult(_request) console.log("APIResponse point") console.log(APIResponse) if (APIResponse != undefined) { console.log("Not Empty Response") // 先设置状态码,再发送响应内容 _res.status(HttpStatus.OK) _res.json(APIResponse.data) _res.statusMessage = APIResponse.statusText } else { console.log("Empty Response") // 直接发送204状态码,无响应体 _res.sendStatus(HttpStatus.NO_CONTENT) } }
更贴合NestJS风格的实现(不使用@Res())
import { Controller, Get, Header, HttpStatus, Req, HttpCode } from '@nestjs/common'; @Get("mediation-get-api") @Header('Access-Control-Allow-Origin', "*") @Header("X-Frame-Options", "SAMEORIGIN always") async getMediationAPI(@Req() _request) { const APIResponse = await this.ServiceObj.getResult(_request) if (APIResponse != undefined) { return APIResponse.data } else { // 设置204状态码,且不返回任何内容 throw new HttpCode(HttpStatus.NO_CONTENT) } }
内容的提问来源于stack exchange,提问作者Huzefa Jtg
相关产品推荐
相关产品推荐

