egg-controller icon indicating copy to clipboard operation
egg-controller copied to clipboard

使用getRoutes得到的接口列表顺序能否按照书写顺序排序?

Open bymmry opened this issue 5 years ago • 2 comments

问题描述

比如有一个TestController,内部有两个接口对应两个function

...
@route('/api/test/create', { name: '创建test', method: ['post'] })
 async create() {
   return await this.ctx.service.test.create();
 }
@route('/api/test/update', { name: '更新test', method: ['post'] })
 async update() {
   return await this.ctx.service.test.update();
 }
...

使用getRoutes得到的数据是,顺序是update()在create()之前

[
  ...,
  {
    ...,
    url: [ '/api/test/update' ],
    typeGlobalName: 'TestController',
    functionName: 'update',
    ...
  },
  {
    ...,
    url: [ '/api/test/create' ],
    typeGlobalName: 'TestController',
    functionName: 'create',
    ...
  },
  ...
]

想达到的效果

使用getRoutes得到的数据,按照controller文件的书写顺序进行排序。按照这里的例子,就是得到create()在update()之前的接口数据。

已尝试过的方法

  • 在写接口的时候在extInfo中添加索引属性。比较麻烦的是,在添加接口的时候,如果想把后面写的接口提前,就要把之前排序重新写一遍,很麻烦,可以实现目的,但是比较不想用。

  • 使用数字作为functionName。比如async 1()、async 2()...比较尴尬的是,看起来呢,不是很好看...新加接口也得像上一种做法一样重新写排序。也比较不想用。

最后

谢谢

bymmry avatar Jul 18 '19 02:07 bymmry

现在的顺序与路由注册顺序一致,因为 koa-router 在多路由匹配的情况下会使用第一条匹配路由,比如:

class Controller {
  @route('/:x')
  b() {}

  @route('/a')
  a() {}
}

会匹配到 b(),而不是精确匹配,所以注册前在 controller 内部的方法会做一次排序,将参数、通配符后置。

这个的顺序会用来做什么?我再看下怎么解决。

zhang740 avatar Jul 19 '19 02:07 zhang740

谢谢! 我是用来做角色分配权限的时候,按照接口url来给权限。给前端返回一个可选接口列表数据,以此来做接口权限分配页面。

比如有两组权限(按照controller文件分的组,序号后面代表的是接口名称)

订单组 1.增加订单 /order/create 2.删除订单 /order/delete 3.修改订单 /order/update 4.查看订单 /order/read

用户组 1.增加用户/user/create 2.删除用户/user/delete 3.修改用户/user/update 4.查看用户/user/read

我是用getRoutes()先得到数据,经过一些需求处理了之后返回给前端。前端页面显示可选权限列表的时候,我也想按照这个例子的接口顺序,就是增删改查的顺序。但是用getRoutes()得到的数据,这个顺序就不是很好把握。有可能订单组是删改查增的顺序,用户组是增删改查的顺序。目的是想让这个顺序,能够方便一点的去人为干涉并可控,比如按照书写顺序排序,这样我要改变顺序,就只需要剪切和粘贴controller文件里面的代码就行了。前面也说了我试过两种办法,还是比较麻烦的。我能想到比较方便的做法就是这样,如果有别的思路,也可以说说。

bymmry avatar Jul 19 '19 08:07 bymmry