背景
在我們使用koa-router
的時候, 隨著項目業(yè)務模塊增加, 路由也會隨之增加, 這時我們就需要將這些路由模塊化管理起來, 增加可讀性和減少后續(xù)維護成本~下面來談談我對koa-router
的理解......另外, 本文適合了解koa基礎(chǔ)的同學學習
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的時候, 傳入?yún)?shù)
const router = new Router({prefix:'前綴名稱'});
方式二:用router示例提供的方法添加前綴
router.prefix('前綴名稱')
- 命名路由
可以指定路由名稱, 并可用攜帶參數(shù)的路由,可以寫中間件處理,ctx
為koa上下文,next
為下一個中間件函數(shù)
router.get('user', '/users/:id', (ctx, next) => {
// ...
});
router.url('user', 3);
// => "/users/3"
- 路由url獲取參數(shù)
命名路由的參數(shù)會由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
文件夾,下面根據(jù)功能模塊新建路由文件
routes目錄結(jié)構(gòu)
貼一個common-routers.js的代碼:
const router = require('koa-router')();
router.prefix("/common");
const common = require('../controllers/common');
// 獲取用戶信息
router.get('/getUserInfo', common.getUserInfo);
// 獲取系統(tǒng)權(quán)限信息
router.get('/getPermission', common.getPermission);
module.exports = router.routes();
- 然后整一個
router.js
文件,代碼如下
const router = require('koa-router')();
/**
* koa路由模塊化處理
* 所有路由請按功能模塊寫在./routers文件夾中,并統(tǒng)一在該文件引入功能模塊的路由
*/
// 業(yè)務模塊1
const moduleA = require('./routes/業(yè)務模塊1');
// 業(yè)務模塊2
const moduleB = require('./routes/業(yè)務模塊2');
// 業(yè)務模塊3
const moduleC = require('./routes/業(yè)務模塊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());
解析路由參數(shù)
-
get
請求可直接從koa的上下文獲取
ctx.request.query
2.post
請求一般會使用koa-body
工具包解析
多個中間件處理
在項目中往往中間件業(yè)務邏輯里有些前置或者后置處理, 這時koa路由支持我們綁定多個中間件:
router.post(
'/xxx', //路徑
// 按順序綁定中間件
中間件函數(shù)1, // 查詢權(quán)限
中間件函數(shù)2, // 調(diào)用功能邏輯函數(shù)
中間件函數(shù)3, //監(jiān)控上報
);
在每個中間件我們要注意對next的處理.
一個請求中不同中間件共享數(shù)據(jù)
可以使用koa中上下文的state屬性存儲起來
// ctx.state.key= value;
ctx.state.reqStart = reqStart;