You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何避免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

火山引擎 最新活动