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

如何在Nest.js控制器的方法体内动态修改响应的HTTP状态码

Nest.js控制器内动态修改HTTP响应状态码的实现方法

下面提供两种主流实现方式,可根据业务场景选择:

方案1:抛出内置HTTP异常(推荐,符合Nest设计规范)

Nest内置了对应所有标准HTTP状态码的异常类,409状态码对应ConflictException,直接在条件判断中抛出即可,框架会自动转换为对应状态码的响应:

// 顶部导入所需类
import { ConflictException, HttpException } from '@nestjs/common';

@Get()
@HttpCode(200)
findAll() {
  if(condition){
    // 方式1:使用409对应的专用异常类,可自定义返回提示
    throw new ConflictException('资源冲突,请求无法完成');
    // 方式2:如果需要自定义任意状态码,用通用HttpException类即可
    // throw new HttpException('自定义提示内容', 409);
  }

  return this.response.success(
    [
      { id: 12, first_name: 'test1' },
      { id: 13, first_name: 'test 2' },
    ],
    'success',
  );
}

如果需要统一异常返回结构,可配合全局异常过滤器使用,完全适配你现有this.response.success的格式规范。

方案2:注入响应对象手动设置状态码

如果不想用异常抛出的逻辑,可通过@Res()装饰器注入底层响应对象手动修改状态码:

// 顶部导入所需类,以Express为例,Fastify可导入对应Response类型
import { Res } from '@nestjs/common';
import { Response } from 'express';

@Get()
@HttpCode(200)
// 开启passthrough参数可保留Nest自动处理响应的能力,不需要手动调用send方法
findAll(@Res({ passthrough: true }) res: Response) {
  if(condition){
    // 手动设置409状态码
    res.status(409);
    // 直接返回你的自定义错误响应结构即可
    return this.response.error('资源冲突', 409);
  }

  return this.response.success(
    [
      { id: 12, first_name: 'test1' },
      { id: 13, first_name: 'test 2' },
    ],
    'success',
  );
}

如果不加passthrough: true参数,Nest会关闭默认响应处理逻辑,需要你手动调用res.json()/res.send()方法返回响应内容。

内容的提问来源于stack exchange,提问作者Rasoul Karimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 11:45:01