如何避免TSOA(Express)生成的swagger.json中自动添加204 No Content响应
解决TSOA自动生成204 NoContent响应的问题
你遇到的这个问题是TSOA的默认行为导致的:当控制器方法返回Promise<void>时,TSOA会自动为其添加204 No Content响应,即便你已经通过@Response装饰器指定了200响应。下面是几种可行的解决方法:
方法1:修改方法返回类型为Promise<never>
你的sendResponse已经直接操作响应对象完成了请求发送,方法本身不会有实际返回值。将返回类型改为Promise<never>可以告诉TSOA这个方法不会正常返回,从而避免生成204响应:
@Get() @Response<UserGetResponse>(200) public async execute(): Promise<never> { this.sendResponse(UserGetController.toResponse({user: undefined})); // 由于sendResponse已结束请求,这里返回一个永远不会resolve的Promise即可 return new Promise(() => {}); }
方法2:使用@NoResponse装饰器移除指定响应
直接在方法上添加@NoResponse(204)装饰器,明确告知TSOA不要生成这个自动添加的204响应:
@Get() @Response<UserGetResponse>(200) @NoResponse(204) public async execute(): Promise<void> { this.sendResponse(UserGetController.toResponse({user: undefined})); }
方法3:全局配置禁用void方法的默认响应
如果你希望所有返回void的控制器方法都不自动生成204响应,可以在tsoa.json配置文件中添加disableImplicitVoidResponses: true:
{ "entryFile": "src/server.ts", "controllerPathGlobs": ["src/**/*Controller.ts"], "disableImplicitVoidResponses": true, // 保留你的其他现有配置项 }
修改完成后,重新运行TSOA的生成命令,生成的swagger.json就只会保留你指定的200响应了。
内容的提问来源于stack exchange,提问作者Pablo León




