请求正文未显示在 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, object, )。最后@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 在护照本地策略中获取请求标头

Nest.js - 请求实体太大 PayloadTooLargeError:请求实体太大

Nest.js Auth Guard JWT 身份验证不断返回 401 未授权

为啥我的 HTTP DELETE 请求正文显示为未定义?