什麼是 Koa 的中間件web
通俗的講:中間件就是匹配路由以前或者匹配路由完成作的一系列的操做,咱們就能夠 把它叫作中間件。express
在express中間件(Middleware)是一個函數,它能夠訪問請求對象(requestobject(req)) , 響應對象(responseobject(res)), 和 web 應用中處理請求-響應循環流程中的中間件,一 般被命名爲 next 的變量。app
在 Koa 中中間件和 express 有點相似。koa
中間件的功能包括:執行任何代碼。 修改請求和響應對象。 終結請求-響應循環。 調用堆棧中的下一個中間件async
若是個人 get、post 回調函數中,沒有 next 參數,那麼就匹配上第一個路由,就不會往下匹 配了。若是想往下匹配的話,那麼須要寫 next()函數
Koa 應用可以使用的幾種中間件post
應用級中間件 ,路由級中間件 ,錯誤處理中間件 ,第三方中間件ui
應用級中間件spa
好比下面在匹配任何路由以前都須要先驗證一些用戶是否有權限訪問這個頁面,這裏demo只是打印一下當前時間code
const koa = require('koa') const router = require('koa-router')() // 引入和實例化路由 const app = new koa() // 建立koa實列 app.use(async (ctx, next) => { console.log(new Date()) // 運行後在匹配任何一個路由以前都會先執行一下這個中間件,無論這個路由存不存在 await next() // 當前路由匹配完成後繼續向下匹配 }) // 配置路由 router.get('/', async (ctx, next) => { ctx.body="Hello koa"; }) router.get('/news', async (ctx, next) => { ctx.body='這是新聞頁面' }); app.use(router.routes()) app.use(router.allowedMethods()); app.listen(3000,()=>{ console.log('starting at port 3000'); })
路由中間件
const koa = require('koa') const router = require('koa-router')() // 引入和實例化路由 const app = new koa() // 建立koa實列 // 配置路由 router.get('/', async (ctx, next) => { ctx.body="Hello koa"; }) // 匹配到news路由之後繼續往下匹配路由 router.get('/news', async (ctx, next) => { console.log('這是新聞頁面'); await next() // 若是沒有這個next那麼訪問路由/news會找不到這個路由 }); router.get('/news', async (ctx) => { console.log(ctx.params); ctx.body='這是新聞頁面' }); app.use(router.routes()) app.use(router.allowedMethods()); app.listen(3000,()=>{ console.log('starting at port 3000'); })
錯誤處理中間件
const koa = require('koa') const router = require('koa-router')() // 引入和實例化路由 const app = new koa() // 建立koa實列 app.use(async (ctx, next)=> { console.log('這是一箇中間件') next(); console.log(ctx.status) if(ctx.status==404){ ctx.status = 404; ctx.body="這是一個 404 頁面" } }) // 配置路由 router.get('/', async (ctx, next) => { ctx.body="Hello koa"; }) router.get('/news', async (ctx) => { console.log('這是新聞頁面') ctx.body='這是新聞頁面' }); app.use(router.routes()) app.use(router.allowedMethods()); app.listen(3000,()=>{ console.log('starting at port 3000'); })
Koa 中間件的執行順序
Koa 的中間件和 Express 不一樣,Koa 選擇了洋蔥圈模型。
當服務端接收到請求後,先執行app.use中間件中next()上面的代碼,next()後會去匹配路由,若是匹配到,執行匹配到的那個路由裏面的代碼,而後在執行中間件中next()下面的代碼
const koa = require('koa') const router = require('koa-router')() // 引入和實例化路由 const app = new koa() // 建立koa實列 //匹配任何路由 ,若是不寫next,這個路由被匹配到了就不會繼續向下匹配 app.use(async (ctx,next)=>{ console.log('一、這是第一個中間件01') await next(); console.log('五、匹配路由完成之後又會返回來執行中間件') }) app.use(async (ctx,next)=>{ console.log('二、這是第二個中間件02') await next(); console.log('四、匹配路由完成之後又會返回來執行中間件') }) // 配置路由 router.get('/', async (ctx, next) => { ctx.body="Hello koa"; }) router.get('/news', async (ctx) => { console.log('三、匹配到了news這個路由') ctx.body='這是新聞頁面' }); app.use(router.routes()) app.use(router.allowedMethods()) app.listen(3000,()=>{ console.log('starting at port 3000') })
執行結果