You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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
}

问题原因

  1. 204响应规则冲突:204 No Content响应明确要求不能包含任何响应体,但你在else分支中调用_res.json({})发送了空对象,客户端会因此自动将状态码转为200 OK。
  2. 链式调用顺序错误:_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:12:50