Skip to content

Latest commit

 

History

History
152 lines (135 loc) · 5.06 KB

README.zh_CN.md

File metadata and controls

152 lines (135 loc) · 5.06 KB

egg-router-factory

node version NPM version build status Test coverage David deps [![Known Vulnerabilities][snyk-image]][snyk-url] npm download

本插件提供了从指定的目录读取文件并根据文件内容来创建路由的功能,并可以通过编写自己的RouterFactory类,轻松的实现对不同中间件的加载和配置,并简单的实现接口文档的生成。

安装

$ npm i egg-router-factory --save

开启插件

// config/plugin.js
exports.routerFactory = {
  enable: true,
  package: 'egg-router-factory',
};

使用场景

在后端开发中,我们经常需要就接口的使用方式和前端进行沟通。而在频繁的修改中每次都和前端沟通是一件非常麻烦的事,在不少场合,还会存在项目开发者修改了接口逻辑却不修改相关注释的情况,这更是极大的增加了代码维护和前后端开发人员的沟通成本。
本插件基于代码即文档的原则进行设计,通过配置文件和工厂类来实现路由的生成,通过自定义中间件和工厂类,我们可以简单的实现接口文档的生成,并确保接口文档永远和接口内容一致。

使用方法

  1. 首先我们需要如下的目录结构
app
+-- http
|   +-- get
|   |   +--index.js
|   |   +--yourpage.js
|   +-- post
|       +--api
|          +--yourapi.js
+-- factory.js
  1. 其次我们需要自定义一个工厂类,大多数情况下,我们只需要继承默认工厂类然后重写其中的setMiddlewares和buildDoc两个方法即可。
// {app_root}/app/factory.js
'use strict';
const RouterFactory = require('egg-router-factory');

class MyFactory extends RouterFactory {
  // 根据配置把中间件添加到参数
  setMiddlewares(obj, args) {
    const app = this.app;
    if(obj.params) {
      args.push(app.middlewares.ajvValidate(obj.params));
    }
    if(obj.userauth) {
      args.push(app.middlewares.userauth(obj.userauth));
    }
    args.push(app.middlewares.onError);
  }
  // 根据路由数据生成文档
  buildDoc() {
    let text = '';
    for (let i = 0; i < this.routers.length; i++) {
      const obj = this.routers[i];
      text += `[${obj.method}]${obj.item.path || obj.path}\n`;
      if(obj.item.params){
        text += params2doc(obj.item.params);
      }
      if(obj.item.userauth){
        text += userauth2doc(obj.item.userauth);
      }
    }
    return text;
  }
}

module.exports = MyFactory;
  1. 在每个路由里面编写你的配置
// {app_root}/app/http/get/index.js
'use strict';

module.exports = {
  path: '/',
  controller: 'home.index',
}
// {app_root}/app/http/get/yourpage.js
module.exports = app => {
  params: { /* 参数配置 */ },
  controller: app.controller.home.yourpage,
}
// {app_root}/app/http/post/api/yourapi.js
module.exports = () => {
  params: { /* 参数配置 */ },
  userauth: { /* 权限配置 */ },
  async controller() {
    /* 实现业务 */
    this.body = 'success';
  },
}
  1. 在router.js里调用工厂类创建全部路由
// {app_root}/app/router.js
'use strict';
module.exports = app => {
  app.routerFactory.buildAllRouters(app.router);
};
  1. 完成!如果需要的话你还可以在测试用例和其他合适的地方调用buildDoc生成接口文档。

路由配置文件

路由配置文件支持两种格式

  • 导出一个包含唯一参数app的函数,该函数返回一个配置JSON
  • 直接导出一个配置JSON

路由文件默认属性

属性 必须 描述
controller true 该参数可以是一个对应controller的字符串,一个controller函数,或是一个无参数的异步函数,当其为无参数的异步函数时,this指针指向当前的ctx
name false 路由名称,可以省略
path false 路由路径,省略时以配置文件的相对路径作为路由路径

详细配置

本插件允许配置工厂类的文件名和路由目录,请到 config/config.default.js 查看详细配置项说明。

单元测试

npm test

License

MIT