如何在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
相关产品推荐
相关产品推荐

