koa 优雅地管理路由

二次开发过很多项目,经常被混乱的路由搞晕
于是自己写了一个路由管理

目录结构

1
2
3
4
5
6
7
8
9
10
▾ src/
▾ controllers/
▾ user/
login.js
register.js
▸ api/
routes.js
▾ utils/
router.js
index.js

router manager tool 路由管理工具

src/utils/router.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
const Router = require('koa-router');
const path = require('path');

const R = new Router();

const allowMethods = new Set(['get', 'post']);

const createRoutes = routes => {
routes.map(route => {
const { prefix, actions } = route;
actions.map(actionObject => {
const { action, type, path: actionPath } = actionObject;
const routePath = path.join(prefix, actionPath);
if (allowMethods.has(type)) {
console.log(`register route ${type.toUpperCase()}`, routePath);
R[type](routePath, action);
} else console.warn('route method is not allowed', routePath);
});
});
return R;
};

export default createRoutes;

router manager 创建路由列表

src/controller/routes.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import createRoutes from '@utils/router';
import loginAction from '@api/user/login';
import registerAction from '@api/user/register';

import joinAction from '@api/room/join';

const routes = [
{
prefix: '/user',
actions: [
{ path: '/login', action: loginAction, type: 'post' },
{ path: '/register', action: registerAction, type: 'post' }
]
},
{
prefix: '/room',
actions: [{ path: '/join', action: joinAction, type: 'get' }]
}
];

export default createRoutes(routes);

route 路由

src/controller/user/login.js

1
2
3
export default async ctx => {
await ctx.render('/view/login');
}

使用

src/index.js

1
2
3
4
5
// 引入路由列表
import routes from '@controllers/routes';

// ...
app.use(routes.routes()).use(routes.allowedMethods());

设置完成后,即生成了3个路由,路径分别为:

  • POST /user/login
  • POST /user/register
  • GET /room/join

demo中的import from path部分设置了module alias, 如有兴趣请搜索alias,查看alias设置篇

# ,

Comments

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×