egg生成swagger文档并同步到yapi

54 阅读3分钟

一、egg生成swagger文档

1.1 安装egg-swagger-doc插件

npm i egg-swagger-doc --save

1.2 修改config/plugin.js

增加下面代码

swaggerdoc: {
    enable: true,
    package: 'egg-swagger-doc',
  },

1.3 修改config/config.default.js

增加swagger相关的配置

/**
   * 配置swagger
   * @property {String} dirScanner - 插件扫描的文档路径
   * @property {String} basePath - api前置路由
   * @property {Object} apiInfo - 可参考Swagger文档中的Info
   * @property {Array[String]} apiInfo - 可参考Swagger文档中的Info
   * @property {Array[String]} schemes - 访问地址协议http或者https
   * @property {Array[String]} consumes - contentType的集合
   * @property {Array[String]} produces - contentType的集合
   * @property {Object} securityDefinitions - 安全验证,具体参考swagger官方文档
   * @property {Boolean} enableSecurity - 是否使用安全验证
   * @property {Boolean} routeMap - 是否自动生成route
   * @property {Boolean} enable - swagger-ui是否可以访问
   */
  config.swaggerdoc = {
    dirScanner: './app/controller',
    apiInfo: {
      title: 'egg-swagger',
      description: 'swagger-ui for egg',
      version: '1.0.0',
    },
    schemes: ['http'],
    // consumes: ['application/json'],
    // produces: ['application/json'],
    securityDefinitions: {
      // apikey: {
      //   type: 'apiKey',
      //   name: 'clientkey',
      //   in: 'header',
      // },
      // oauth2: {
      //   type: 'oauth2',
      //   tokenUrl: 'http://petstore.swagger.io/oauth/dialog',
      //   flow: 'password',
      //   scopes: {
      //     'write:access_token': 'write access_token',
      //     'read:access_token': 'read access_token',
      //   },
      // },
    },
    // enableSecurity: false,
    // enableValidate: true,
    routerMap: true,
    enable: true,
 
  }

1.4 根据文件添加具体模块

// app/controller/test.js
/**
 *  笔记路由note
 * @Controller 笔记
 */

1.5 编写接口的相关注释

// app/controller/test.js
  /**
   * @summary 获取笔记
   * @description 获取笔记
   * @Router get /setNoteList
   * @request query string username 账户名
   * @request query integer page 页码 默认 1
   * @request query integer pageSize 单页数量 默认 10
   * @Request header string authorization token值
  * */
  async test(){
        xxxxxx
  }

相关注释的含义:

  • @controller 这个就是一个tag
  • @summary 简介
  • @description 描述
  • @router 就是请求地址
  • @request 其实是swagger里面的parames,其中的authorize_login是定义中app/contract的一个object。翻译到swagger就是一个 object的引用。
  • @response 响应,其中的baseResponse,同上。
  • @consumes 提交到请求的数据格式(即带body的请求,例如post,有效其他无效),如果没有定义,则跟从配置文件设置。如果要多种选择,可以用空格分开,例如 @consumes html/text application/json。
  • @product 同上。

1.6 新建contract文件夹,新建index.js

//app/contract/index.js

1.7 验证访问

二、同步swagger文档到yapi中

2.1 编写脚本将生成的swagger的json文件保存到本地

//create_swagger.js
'use strict';
const http = require('http');
const fs = require('fs');
// URL地址
const url = 'http://localhost:7001/swagger-doc'; // 替换为要获取的URL地址
// 创建写入流对象
const writeStream = fs.createWriteStream('swagger.json');
// 发起GET请求
http.get(url, response => {
    // 通过管道将数据从服务器传输到文件
    response.pipe(writeStream);
});
console.log(`正在获取 ${url}...`);

2.2 安装导入yapi的插件

参考链接:hellosean1025.github.io/yapi/docume…

使用方法

第一步,确保 yapi-cli >= 1.2.7 版本,如果低于此版本请升级 yapi-cli 工具

npm install -g yapi-cli

第二步,在任意一个目录下新建配置文件 yapi-import.json,内容如下:

{
  "type": "swagger",
  "token": "17fba0027f300248b804",
  "file": "swagger.json",
  "merge": "normal",
  "server": "http://yapi.local.qunar.com:3000"
}

type 是数据数据方式,目前官方只支持 swagger token 是项目 token,在 项目设置 -> token 设置获取 file 是 swagger 接口文档文件,可使用绝对路径或 url merge 有三种导入方式(v1.3.23+支持) normal, good, mergin

  1. 普通模式(normal):不导入已存在的接口;
  2. 智能合并(good):已存在的接口,将合并返回数据的 response,适用于导入了 swagger 数据,保留对数据结构的改动;
  3. 完全覆盖(mergin):不保留旧数据,完全使用新数据,适用于接口定义完全交给后端定义, 默认为 normal server 是 yapi 服务器地址 第三步,在新建配置文件的当前目录,执行下面指令
yapi import

2.3 验证是否成功导入

sss.png