egg-controller
egg-controller copied to clipboard
使用getRoutes得到的接口列表顺序能否按照书写顺序排序?
问题描述
比如有一个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()...比较尴尬的是,看起来呢,不是很好看...新加接口也得像上一种做法一样重新写排序。也比较不想用。
最后
谢谢
现在的顺序与路由注册顺序一致,因为 koa-router 在多路由匹配的情况下会使用第一条匹配路由,比如:
class Controller {
@route('/:x')
b() {}
@route('/a')
a() {}
}
会匹配到 b(),而不是精确匹配,所以注册前在 controller 内部的方法会做一次排序,将参数、通配符后置。
这个的顺序会用来做什么?我再看下怎么解决。
谢谢! 我是用来做角色分配权限的时候,按照接口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文件里面的代码就行了。前面也说了我试过两种办法,还是比较麻烦的。我能想到比较方便的做法就是这样,如果有别的思路,也可以说说。