Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
bymmry opened this issue Jul 18, 2019 · 2 comments

Comments

@bymmry
Copy link

bymmry commented Jul 18, 2019

问题描述

比如有一个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()...比较尴尬的是,看起来呢,不是很好看...新加接口也得像上一种做法一样重新写排序。也比较不想用。

最后

谢谢

@zhang740
Copy link
Owner

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

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

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

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

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

@bymmry
Copy link
Author

bymmry commented Jul 19, 2019

谢谢!
我是用来做角色分配权限的时候,按照接口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文件里面的代码就行了。前面也说了我试过两种办法,还是比较麻烦的。我能想到比较方便的做法就是这样,如果有别的思路,也可以说说。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants