背景
在我们使用koa-router
的时候, 随着项目业务模块增加, 路由也会随之增加, 这时我们就需要将这些路由模块化管理起来, 增加可读性和减少后续维护成本~下面来谈谈我对koa-router
的理解......另外, 本文适合了解koa基础的同学学习
koa-router
- 官方文档: https://github.com/koajs/router/blob/master/API.md
-
koa-router
是koa
提供的路由中间件
使用
- 安装
npm i koa-router
- 用法
- 基本用法
const Router = require('koa-router');
const app = new Koa();
const router = new Router();
router.get('/', (ctx, next) => {
// ctx.router available
});
app
.use(router.routes())
.use(router.allowedMethods());
- 添加路由前缀
方式一: 在实例化koa-router的时候, 传入参数
const router = new Router({prefix:'前缀名称'});
方式二:用router示例提供的方法添加前缀
router.prefix('前缀名称')
- 命名路由
可以指定路由名称, 并可用携带参数的路由,可以写中间件处理,ctx
为koa上下文,next
为下一个中间件函数
router.get('user', '/users/:id', (ctx, next) => {
// ...
});
router.url('user', 3);
// => "/users/3"
- 路由url获取参数
命名路由的参数会由ctx.params
捕获到
router.get('/:category/:title', (ctx, next) => {
console.log(ctx.params);
// => { category: 'programming', title: 'how-to-node' }
});
- 从url模式生成URL并给出params
const url = Router.url('/users/:id', {id: 1});
// => "/users/1"
路由模块化
- 在项目根目录整一个
routes
文件夹,下面根据功能模块新建路由文件
routes目录结构
贴一个common-routers.js的代码:
const router = require('koa-router')();
router.prefix("/common");
const common = require('../controllers/common');
// 获取用户信息
router.get('/getUserInfo', common.getUserInfo);
// 获取系统权限信息
router.get('/getPermission', common.getPermission);
module.exports = router.routes();
- 然后整一个
router.js
文件,代码如下
const router = require('koa-router')();
/**
* koa路由模块化处理
* 所有路由请按功能模块写在./routers文件夹中,并统一在该文件引入功能模块的路由
*/
// 业务模块1
const moduleA = require('./routes/业务模块1');
// 业务模块2
const moduleB = require('./routes/业务模块2');
// 业务模块3
const moduleC = require('./routes/业务模块3');
router.use(moduleA).use(moduleB).use(moduleC);
// Export router
module.exports = router;
- 最后在项目的入口文件引入
router.js
const Koa = require('koa');
//此处省略很多, 如配置服务器端口,ip,中间件等......
const app = new Koa();
// 路由
const router = require('./router');
app.use(router.routes())
.use(router.allowedMethods());
解析路由参数
-
get
请求可直接从koa的上下文获取
ctx.request.query
2.post
请求一般会使用koa-body
工具包解析
多个中间件处理
在项目中往往中间件业务逻辑里有些前置或者后置处理, 这时koa路由支持我们绑定多个中间件:
router.post(
'/xxx', //路径
// 按顺序绑定中间件
中间件函数1, // 查询权限
中间件函数2, // 调用功能逻辑函数
中间件函数3, //监控上报
);
在每个中间件我们要注意对next的处理.
一个请求中不同中间件共享数据
可以使用koa中上下文的state属性存储起来
// ctx.state.key= value;
ctx.state.reqStart = reqStart;