NestJS自定义Swagger响应装饰器导致所有接口返回类型被覆盖问题
问题根因
Swagger生成接口文档时,会以响应类的类名作为Schema的唯一识别标识。你当前mapResponse方法里返回的动态类统一命名为Response,所有接口的响应类都会被Swagger判定为同一个Schema,最后加载的模块的类型自然就会覆盖掉之前所有同名称Schema的定义。
修复方案
给动态生成的响应类设置和业务数据类型绑定的唯一类名即可,修改mapResponse函数如下:
const mapResponse = <T>(type: T) => { // 生成唯一类名,兼容数组、自定义类、基础类型三种场景 let typeName: string; if (Array.isArray(type)) { typeName = `${type[0].name}List`; } else if (typeof type === 'function') { typeName = type.name; } else { typeName = String(type); } const className = `${typeName}Response`; // 动态创建带唯一类名的响应类 const ResponseClass = { [className]: class extends BaseResponse { @ApiProperty({ type }) data: T; } }[className]; return ResponseClass; };
修改后重启项目即可生效,如果你还封装了Post、Put等其他请求方法的自定义装饰器,不需要额外修改,改mapResponse这一处就可以全局解决类型覆盖问题。
内容的提问来源于stack exchange,提问作者ordidxzero
相关产品推荐
相关产品推荐

