请求正文未显示在 Nest.js + Swagger 中
Posted
技术标签:
【中文标题】请求正文未显示在 Nest.js + Swagger 中【英文标题】:Request body not showing in Nest.js + Swagger 【发布时间】:2020-09-14 22:39:47 【问题描述】:我的控制器代码是这样的。
@Controller('customer')
export class CustomerController
constructor(private readonly customerService: CustomerService)
@Post('lookup')
async someMethod(@Body() body:any)
console.log("BEGIN -- CustomerController.someMethod");
我希望在 Swagger 中看到一个可以输入一些文本作为请求正文的地方,但我却看到了这个
【问题讨论】:
你在使用 Swagger 插件吗? 在我的 package.json 我有 "@nestjs/swagger": "^4.4.0", 在您的nest-cli.json
中您使用的是swagger 插件吗?
我不太确定插件在这里是什么意思,但这就是我的nest-cli.json中的内容
"collection": "@nestjs/schematics", "sourceRoot": "src"
【参考方案1】:
所以听起来这里发生了一些事情。 Swagger UI 是用于发送请求的辅助工具,但要做到这一点,它需要知道请求正文的形状。 any
不够好。如果您正在寻找一种可以发送任何东西的工具,那么 curl 或 postman 是您最好的选择(至少免费)。
Nest 有一个Swagger plugin,它将读取您的 Typescript 代码并相应地修饰您的类型和方法,但您必须选择启用它。否则,您需要使用 @nestjs/swagger
包中的装饰器来告诉 Swagger 预期哪些类型进出方法。
只要与@Body()
对应的类型具有 swagger 装饰器或您启用 swagger 插件 并且有一个有效的类,swagger UI 应该显示为预期的,但是使用上述类型并使用 any
类型对您没有任何好处。
【讨论】:
我是否需要安装 Swagger 插件,或者如果我的 package.json 中有这个插件,它是开箱即用的吗? "@nestjs/swagger": "^4.4.0" 我的回答中的文档链接清楚地解释了如何设置插件工作。 我尝试将正文类型设置为界面,但仍然无法正常工作。最后,将接口替换为类工作。谢谢... 接口在运行时不存在,因此没有反映它们的元数据。【参考方案2】:添加@ApiProperty()
export class User
@ApiProperty()
name:string
【讨论】:
【参考方案3】:我的端点接受未知的键/值数据并且我遇到了同样的问题(我尝试了 any, unknown, Record@Body() data: Map<string, any>
为我工作。
【讨论】:
【参考方案4】:试试这样:
@ApiBody(description: "body:any someMethod")
@Post('lookup')
async someMethod(@Body() body:any)
console.log("BEGIN -- CustomerController.someMethod");
【讨论】:
【参考方案5】:Swagger 无法解释您的代码。 不是您的代码有问题。如果您的目标是测试您的 API 以供 UI 团队使用,而不是全面的 swagger 文档,那么我发现使用 Postman 是最简单的。 尝试使用 Postman 访问您的 API。
【讨论】:
以上是关于请求正文未显示在 Nest.js + Swagger 中的主要内容,如果未能解决你的问题,请参考以下文章
在 Nest JS 中发出 http 请求时出现 httpService 未定义错误
如何清理 Node.js 和 Typescript 中的响应正文
Nest.js - 请求实体太大 PayloadTooLargeError:请求实体太大