var Koa = require('koa');
var Router = require('koa-router');
var app = new Koa();
var router = new Router();
router.get('/home',(ctx,next)=>{
ctx.body = 'home'
next();
});
router.get('/user', (ctx, next) => {
ctx.body = 'user';
next();
});
app.use(router.routes())
app.use(router.allowedMethods());
複製代碼
var Koa = require('koa');
var Router = require('koa-router');
var app = new Koa();
var router = new Router();
//將路由的處理交給中間件
app.use((ctx, next) => {
if (ctx.path === '/' && ctx.method === 'GET') {
ctx.body = '首頁'
} else {
next();
}
})
app.use((ctx, next) => {
if (ctx.path === '/user' && ctx.method === 'GET') {
ctx.body = '用戶'
} else {
next();
}
});
複製代碼
從上面能夠知道,若是沒有koa-router,其實每一個路由使用的koa註冊中間件的形式來進行處理的,這樣不利於鬆耦合和模塊化,因此將全部路由的處理邏輯抽離出來組合成一個大的中間件koa-router來處理,最後將大的中間件註冊到koa上,若是關於koa中間件原理還不瞭解,能夠參考另外一篇文章koa框架會用也會寫—(koa的基礎框架)css
既然koa-router也是大的中間件,裏面擁有許多小的中間件,那麼裏面必然也須要用到洋蔥模型,洋蔥模型的特色:html
若是對於中間件和洋蔥模型有疑問的,能夠參考koa框架會用也會寫—(koa的基礎架構)mysql
class Layer {
constructor(path,callback) {
this.path = path //路由路徑
this.cb = callback //對應的處理函數
}
}
複製代碼
class Router {
constructor() {
this.middles = [];
}
}
module.exports = Router
複製代碼
class Router {
constructor() {
this.middles = [];
}
//set,post等同理
get(path,callback) {
const layer = new Layer(path,callback)
this.middles.push(layer)
}
}
module.exports = Router
複製代碼
class Router {
constructor(){
this.middles=[];
}
//set,post等同理
get(path,fn){
const layer = new Layer(path,callback)
this.middles.push(layer)
}
compose(){}
routes() {
// 返回一個組合的中間件router.routes供app.use註冊
// next是koa-router以後app.use註冊的中間件
return async (ctx, next) => {
// 請求的路徑
let path = ctx.path;
// 和路徑匹配的路由的處理函數
let arr = []
for(let item of this.middles) {
if(item.path === path) {
arr.push(item.cb)
}
}
// 一級路由下面還有二級路由
// 用洋蔥模型串聯全部匹配路由的處理函數
this.compose(ctx, arr,next);
}
}
}
module.exports = Router
複製代碼
class Router {
constructor() {
this.middles = [];
}
//set,post等同理
get(path,callback){
const layer = new Layer(path,callback)
this.middles.push(layer)
}
//arr爲匹配的路由集合
compose(ctx,arr,next){
dispatch(index){
// 全部的路由處理完成以後,處理在路由中間件後面app.use註冊的中間件
if(index === lasts.length) return next();
let route = arr[index];
route(ctx,()=>{dispatch(index+1)})
}
dispatch(0)
},
return async (ctx, next) => {
// 請求的路徑
let path = ctx.path;
// 和路徑匹配的路由的處理函數
let arr = []
for(let item of this.middles) {
if(item.path === 'path') {
arr.push(item.cb)
}
}
// 一級路由下面還有二級路由
// 用洋蔥模型串聯全部匹配路由的處理函數
this.compose(ctx, arr,next);
}
}
module.exports = Router
複製代碼
上面的router是簡化版的koa-router,它只實現了koa-router中的一級路由,可是倒是能說明koa-router的核心思想,koa-router中添加了use來註冊二級路由,同時添加了不少包括重定向等其餘邏輯處理sql
koa-router中間件的原理基本就介紹完了,後面一塊兒學習kao的其餘中間件:數據庫