一步一步教你Koa2编写接口文档(不写接口文档的后端不是好后端)

3,417 阅读5分钟

今天去野餐,去买票的时候,问可以野炊吗,售票员说不可以,只能野餐,对,我们就是要野餐,没有火的那种,笑死了都,HHHHHH

前言

  • 在线音乐戳我呀!
  • 音乐博客源码上线啦!
  • 相信在开发中前端都会要求后端写接口文档,但各别后端觉得写接口文档麻烦,之前群里有人吐槽他们公司的后端直接把实体类丢给他(抱歉,没笑出声~ HHHHHH)
  • 实习公司其实也没写接口文档,因为前后端可能都是一个人开发,于是在开发个人音乐博客也习惯没写接口文档,去年来到现在公司,前后端对接用 swagger 接口文档,于是今天开始音乐博客也要用接口文档啦!

接口文档最终页面效果

先给各位猿友看看实现的效果,其实做每件事情有了目标,实现起来并不再迷茫

1.png

使用 swagger-jsdoc 编写接口文档

swagger-jsdoc 使得我们可以将swagger融入到基于JsDoc的注释当中去,这确实是一个对代码侵入性较小,同时能够大大方便对项目文档维护的方式。

下载

npm i koa2-swagger-ui swagger-jsdoc --save

PS:这里的swagger-jsdoc下载最新版本,使用的话会报错,所以我安装了6.0.0版本(报错,第一想到就是版本兼容问题)

新建一个文件 swagger.js

4.png

PS:因为我的接口都写在routes文件夹中,猿友们根据自己的接口写的文件位置,进行配置options.apis

在app.js引入使用

5.png

PS:这里说下app.use(koaSwagger.koaSwagger({})),看别人写的文章这里其实不是这样写的,而是app.use(koaSwagger({})),这种写法可能是swagger-jsdoc之前低版本的写法,而我为什么会知道这样写的,因为在调试过程中不断打印该对象存在什么值、函数,最终才得知需要这样写才可成功,开发调试打印输出是多么重要!

可以开始编写GET请求的接口文档啦

在注释中使用@swagger开头,然后就可以按照 swagger 的语法来进行接口的定义。这样子极大地方便了文档的书写和修改,在程序员对接口进行修改之后,也不至于忘记维护接口文档,同时可以更加方便的实时的调试自己的接口。

6.png

swagger 效果

2.png

PS:

  • http://localhost:3333/swagger现在就可以在网页上看到页面啦

  • GET 请求是 in: query,写错会接收不到参数的哦~

编写POST请求的接口文档

7.png

swagger 效果

3.png

PS:POST 请求是 in: body,写错会接收不到参数的哦~

编写PUT请求的接口文档

8.png

PS:PUT 请求也是 in: body,和POST一样~

编写DELETE请求的接口文档

9.png

PS:DELETE 请求是 in: query,和GET一样~

其实这些@swagger注解,不需要写在方法上面,可以写在 router 文件夹中任何一处,因为在上面的 swagger.js 写上了 apis: ['./routes/*/*.js']

那么,我又有一个想法了。(因为不用谢在接口方法上,所以可封装模板)

装饰器封装模板注解在接口方法上

思路

将上面增删改查抽成一个类,然后用注解的形式(装饰器)传参用在接口方法上,就不用每次都写一堆。

先让项目KOA支持es7语法

安装babel,与装饰器的编译依赖(只需要要开发环境安装) babel-cli,babel-core,babel-register,babel-plugin-transform-decorators-legacy

npm install babel-cli babel-core babel-register babel-plugin-transform-decorators-legacy --save-dev;

配置 .babelrc 文件让 其能使用装饰器

{
    "presets": [],
    "plugins": [
        "transform-decorators-legacy"
    ]
}

app.js 引入

require("babel-register");

欧克,项目已支持es7语法。

使用VS CODE的时候,使用装饰器@xxx,编辑器检查语法不通过

打开vs code 设置页

12.png

修改 javascript.implicitProjectConfig.experimentalDecorators 属性的值为 true

13.png

如果,语法检查任然有报错,重启vscode 即可(当然使用ES7及要安装ES7的babel-loader,否则代码编译会报错,教程在上方)

接着写个class来当swagger的基类,里面有GET、POST、PUT、DELETE四个方法的@swagger

10.png

/featuresDev/ 这个方法换做${url},发现在注释中,是换不了的,不论我后面定义多个变量避免注释进行拼接,打印出来的效果和上图一样,在swagger中也起不了作用。后面我放弃了,这个思路是可以的,只不过写法可能还要在研究研究一下。

koa-swagger-decorator

如果用上了该库,那么就可以这样写

11.png

可我用了却报错:各种写法,各种错

  • TypeError: SwaggerRouter is not a constructor

  • SyntaxError: Invalid or unexpected token at wrapSafe (internal/modules/cjs/l)

  • declaration expected

  • SyntaxError: Invalid or unexpected token

所以我才想自己写装饰器封装模板注解在接口方法上,暂时还是先用swagger-jsdoc写接口文档,之后有时间在研究研究。

有猿友能不吝告知,自当感谢感谢!

代码源码请戳一戳!!!

参考文章

Swagger API文档

koa-swagger-decorator:基于注解根据API自动生成可视化swagger文档

koa swagger decorator的集成

node环境 Express编写的后台接口如何结合swagger-ui【解决新版无法传输参数和自定义Authorization】

koa2使用es7 的装饰器decorator

swagger-decorator:注解方式为 Koa2 应用动态生成 Swagger 文档

Visual Studio Code 解决 TypeScript(or ES7)语法检查报错设置

以往推荐

Vue-Cli3搭建组件库

Vue实现动态路由(和面试官吹项目亮点)

项目中你不知道的Axios骚操作(手写核心原理、兼容性)

VuePress搭建项目组件文档

koa2+vue+nginx部署

vue-typescript-admin-template后台管理系统

原文链接

juejin.cn/post/694770…