项目作者: zzzs

项目描述 :
have the ability to route group operations for eggjs (使eggjs具有路由群组操作的能力)
高级语言: JavaScript
项目地址: git://github.com/zzzs/egg-router-group.git


egg-router-group

NPM version
build status
Test coverage
David deps
Known Vulnerabilities
npm download

have the ability to route group operations for eggjs.

赋予eggjs路由群组操作的能力。

Install

  1. $ npm i egg-router-group --save

Mount

  1. // {app_root}/config/plugin.js
  2. exports.routerGroup = {
  3. enable: true,
  4. package: 'egg-router-group',
  5. };

Features

为 app.router 注入了路由群组 group(options, cb) 方法, options: 路由群组公用属性, cb: 路由回调。

路由群组允许你共用路由属性,例如:路由别名前缀,路由url前缀,中间件等,你可以利用路由群组统一为多个路由设置共同属性,而不需在每个路由上都设置一次。共用属性被指定为对象格式,当作 app.router.group 方法的第一个参数,具体路由群组的相关内容,可参考下面几个常用样例来熟悉这些特性。

目前支持这三种属性

  • 路由别名前缀: name
  • 路由url前缀: prefix
  • 中间件: middlewares

Usage

基本用法

  1. // {app_root}/app/router.js
  2. module.exports = app => {
  3. const { router, controller, middleware } = app;
  4. const m1 = middleware.m1();
  5. const m2 = middleware.m2({ key: 'value' });
  6. const m3 = middleware.m3();
  7. router.group({ name: 'home::', prefix: '/pre', middlewares: [ m1, m2 ] }, router => {
  8. // router-path: /pre/test, middlewares: m1, m2
  9. // router-path: /pre/test2, middlewares: m1, m2
  10. router.get('/test', controller.home.test).get('/test2', controller.home.test);
  11. // router-name: home::post, router-path: /pre/post, middlewares: m1, m2, m3
  12. router.post('post', '/post', m3, controller.home.post);
  13. // others
  14. router.all('/test', controller.home.all1);
  15. router.all('testname', '/test2', controller.home.all2);
  16. router.put('/put', controller.home.put);
  17. router.delete('/delete', controller.home.delete);
  18. router.del('/del', controller.home.del);
  19. router.options('/options', controller.home.options);
  20. router.patch('/patch', controller.home.patch);
  21. router.redirect('/redirect', '/');
  22. router.redirect('/redirect2', 'home::testname', 302);
  23. });
  24. // 设置单个属性
  25. router.group({ name: 'home::' }, router => {
  26. // router-path: /test
  27. router.get('/test', controller.home.test);
  28. // router-name: home::post, router-path: /post
  29. router.post('post', '/post', controller.home.post);
  30. });
  31. // group 同样支持链式操作
  32. router.group({ name: 'home::', prefix: '/pre', middlewares: [ m1, m2 ] }, router => {
  33. // router-path: /pre/test, middlewares: m1, m2
  34. // router-path: /pre/test2, middlewares: m1, m2 ⚠️这里🈶️group 设置的属性哦
  35. router.get('/test', controller.home.test).get('/test2', controller.home.test);
  36. })
  37. .get('/test3', controller.home.test); // router-path: /test3 ⚠️这里🈚group 设置的属性哦
  38. };

中间件

支持传单个中间件或数组的形式

  1. // {app_root}/app/router.js
  2. module.exports = app => {
  3. const { router, controller, middleware } = app;
  4. const m1 = middleware.m1();
  5. const m2 = middleware.m2({ key: 'value' });
  6. router.group({ middlewares: [ m1, m2 ] }, router => {
  7. router.get('/test_m1', controller.home.test_m1);
  8. router.post('/test_m2/:id', controller.home.test_m2);
  9. });
  10. router.group({ middlewares: m1 }, router => {
  11. router.get('/test_m3', controller.home.test_m3);
  12. router.post('/test_m4/:id', controller.home.test_m4);
  13. });
  14. };

路由别名前缀 & 路由url前缀

路由别名前缀 & 路由url前缀 只支持string类型

  1. // {app_root}/app/router.js
  2. module.exports = app => {
  3. // name
  4. router.group({ name: 'home::' }, router => {
  5. // router-name: home::post
  6. router.post('post', '/test/:id', controller.home.t1);
  7. });
  8. // prefix
  9. router.group({ prefix: '/pre' }, router => {
  10. // router-name: test, router-path: /pre/test2
  11. router.get('test', '/test2', controller.home.t2);
  12. });
  13. };

Advanced Usage

路由子群组,顾名思义,即路由群组内也可以使用路由群组功能,很适用于大型项目,当路由到达一定量级时,也能轻松维护管理。如果你想的话,路由群组可以一直嵌套下去。

注:如果出现设置重复的中间件,该中间件也会被执行多次,这部分自由度还是会开放给用户,不做特殊处理。

  1. // {app_root}/app/router.js
  2. router.group({ name: 'home1::', prefix: '/pre1', middlewares: m1 }, router => {
  3. // router-name: home1::name_g1, router-path: /pre1/test_g1, middlewares: m1, m2
  4. router.get('name_g1', '/test_g1', m2, controller.group.g1);
  5. router.group({ prefix: '/pre2', middlewares: m2 }, router => {
  6. // router-path: /pre1/pre2/test_g3, middlewares: m1, m2, m2
  7. router.get('/test_g3', m2, controller.group.g1);
  8. // router-path: /pre1/pre2/test_g4/:id, middlewares: m1, m2
  9. // router-path: /pre1/pre2/test_g4_1/:id, middlewares: m1, m2
  10. router.post('/test_g4/:id', controller.group.g2).get('/test_g4_1', controller.group.g2);
  11. router.group({ name: 'home2::' }, router => {
  12. // router-name: home1::home2::name_g6, router-path: /pre1/pre2/test_g6/:id, middlewares: m1, m2
  13. router.post('name_g6', '/test_g6/:id', controller.group.g2);
  14. // ...
  15. });
  16. })
  17. .get('/test_g2_1', controller.group.g1); // router-path: /pre1/test_g2_1, middlewares: m1
  18. });

Questions & Suggestions

Please open an issue here.

License

MIT