NestJS 实战(1) 集成 Swagger 文档直接调试接口

NestJS开发过程中使用 Swagger 文档进行注释和调试非常的方便,分享一下使用的心得:

NestJS 的安装过程请自行搜索 NestJS 文档

创建项目并进入到目录

// 安装过程假设用户已经全局安装了 newtjs/cli
nest new thmall
cd thmall
  • 安装时系统会询问用何种方式进行包管理,我们这里选择 pnpm
    项目创建界面

创建 RESTFUL 风格用户接口

nest g resource user
  • 创建完成后目录
user
├── dto
│   ├── create-user.dto.ts
│   └── update-user.dto.ts
├── entities
│   └── user.entity.ts
├── user.controller.spec.ts
├── user.controller.ts
├── user.module.ts
├── user.service.spec.ts
└── user.service.ts
  • 调整目录结构,提高可读性及方便日后维护,(这个步骤仅为个人习惯,非必要)

修改目录后文件引用路径会发生变化,使用 vscode 编辑器会自动修改,若报错需要手动处理一下

user
├── controllers
│   └── user.controller.ts
├── dto
│   ├── create-user.dto.ts
│   └── update-user.dto.ts
├── entities
│   └── user.entity.ts
├── services
│   └── user.service.ts
└── user.module.ts

创建 Swagger 文档

安装依赖

pnpm i @nestjs/swagger

src 目录下添加 doc.ts 文件,配置 swagger 文档

// src/doc.ts
import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'
import * as packageConfig from '../package.json'

export const generateDocument = (app) => {
  const options = new DocumentBuilder()
    .setTitle(packageConfig.name)
    .setDescription(packageConfig.description)
    .setVersion(packageConfig.version)
    .addBearerAuth() // 允许tonken鉴权
    .build()

  const document = SwaggerModule.createDocument(app, options)
  SwaggerModule.setup('/api/doc', app, document)
}


引用 json 文件需要先配置 tsconfig:

// src/tsconfig.json

"resolveJsonModule": true,

main.ts 中引用上述代码的创建方法

// src/main.ts
import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'
import { generateDocument } from './doc'

async function bootstrap() {
  const app = await NestFactory.create(AppModule)

  // 创建文档
  generateDocument(app)
  await app.listen(3000)
}
bootstrap()

使用代码 pnpm start:dev 运行服务端,成功后在浏览器访问文档地址 (http://localhost:3000/api/doc/)[http://localhost:3000/api/doc/]即可访问文档

swagger文档页面

@nestjs/swagger 的装饰器语法进行 swagger 文档注释

// src/user/controllers/user.controller.ts
... 
@ApiTags('用户')
@Controller('user')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @ApiOperation({
    summary: '新增用户',
  })
  @Post()
  create(@Body() createUserDto: CreateUserDto) {
    return this.userService.create(createUserDto)
  }
...
}

添加文档注释后的页面


添加文档注释后的页面

点击 try it out 即可进行调试


点击 try it out 即可进行调试

执行后即可获得接口运行结果,非常方便. (红框部分为服务器 返回逻辑,是真实的运行结果)


红框部分为服务器 返回逻辑,是真实的运行结果

使用 @nestjs/swagger 的装饰器语法对CreateUserDto参数进行说明,当我们使用 example 属性时就可以在 swagger 文档上设置默认测试的值

// src/user/dto/create-user.dto.ts
import { ApiProperty } from '@nestjs/swagger'

export class CreateUserDto {
  @ApiProperty({ example: '18888888888' })
  readonly phoneNumber: string

  @ApiProperty({ example: 'Nick' })
  name: string

  @ApiProperty({ example: '123456' })
  password: string

  @ApiProperty({ example: 'qqqa@qq.com' })
  email: string
}

可以得到结果如下

设置 example 结果

使用 Pipe 实现数据校验

安装依赖:

pnpm i class-validator class-transformer

使用装饰器语法对接口输入数据进行验证设置

// src/user/dto/create-user.dto.ts
import { ApiProperty } from '@nestjs/swagger'

import { IsNotEmpty, Matches } from 'class-validator'

export class CreateUserDto {
  @ApiProperty({ example: '18888888888' })
  @IsNotEmpty({ message: '请输入手机号' })
  @Matches(/^1\d{10}$/g, { message: '请输入手机号' })
  readonly phoneNumber: string

  @ApiProperty({ example: 'Nick' })
  @IsNotEmpty()
  name: string

  @ApiProperty({ example: '123456' })
  @IsNotEmpty()
  password: string

  @ApiProperty({ example: 'qqqa@qq.com' })
  @IsNotEmpty()
  email: string
}

配置后接口发起请求时即可对输入参数进行校验。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容