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

路由信息解析不出来

Open kerryChen95 opened this issue 2 years ago • 4 comments

因为 swagger-egg 是自己用正则解析 app/router.ts 文件内容,获取路由信息。 参考 node_modules/swagger-egg/lib/router_loader.js 中的 getRouter() 方法。

导致很多情况解析不出来,比如

  • 使用 egg-router-plus
  • 使用 `'router-name'``
  • 'path-match' 不是字符串字面量,而是一个表达式或变量
router.verb('path-match', app.controller.action);
router.verb('router-name', 'path-match', app.controller.action);
router.verb('path-match', middleware1, ..., middlewareN, app.controller.action);
router.verb('router-name', 'path-match', middleware1, ..., middlewareN, app.controller.action);

kerryChen95 avatar Apr 13 '22 08:04 kerryChen95

因为 swagger-egg 是自己用正则解析 app/router.ts 文件内容,获取路由信息。 参考 node_modules/swagger-egg/lib/router_loader.js 中的 getRouter() 方法。

导致很多情况解析不出来,比如

  • 使用 egg-router-plus
  • 使用 `'router-name'``
  • 'path-match' 不是字符串字面量,而是一个表达式或变量
router.verb('path-match', app.controller.action);
router.verb('router-name', 'path-match', app.controller.action);
router.verb('path-match', middleware1, ..., middlewareN, app.controller.action);
router.verb('router-name', 'path-match', middleware1, ..., middlewareN, app.controller.action);

确实会有这个限制,目前router只支持官方文档的写法。插件之所以满足不了的根本原因是从app.router中拿不到controller对应的方法名称,只能得到函数。拿不到函数名称就找不到对应的swagger接口注释了。

JsonMa avatar Apr 13 '22 09:04 JsonMa

能拿到函数的话,函数对象的 name 属性可以解决这个问题吗?

kerryChen95 avatar Apr 13 '22 09:04 kerryChen95

能拿到函数的话,函数对象的 name 属性可以解决这个问题吗?

能拿到controller的文件名和函数名就可以不用去扫描router文件了。装饰器的写法就不会出现这个问题,因为装饰器是直接在controller文件读取的路由信息。

JsonMa avatar Apr 13 '22 09:04 JsonMa

@JsonMa 装饰器的写法?我看 README.md 里没介绍有,目前支持了吗?

kerryChen95 avatar Apr 18 '22 08:04 kerryChen95