學習架構:html
在實戰項目中,常常須要記錄下服務器的響應時間,也就是從服務器接收到HTTP請求,到最終返回給客戶端之間所耗時長。在Koa應用中,利用中間件機制能夠很方便的實現這一功能。代碼以下所示:瀏覽器
01 const koa = require('koa'); 02 const app = new koa(); 03 app.use(async (ctx, next) => { // 記錄服務器響應時間的中間件 04 let stime = new Date().getTime(); // 記錄當前時間戳 05 await next(); // 事件控制權中轉 06 let etime = new Date().getTime(); // 全部中間件執行完成後記錄當前時間 07 ctx.response.type = 'text/html'; 08 ctx.response.body = '<h1>Hello World</h1>'; 09 console.log(`請求地址: ${ctx.path},響應時間:${etime - stime}ms`); 10 }); 11 app.use(async (ctx, next) => { 12 console.log('中間件 doSoming'); 13 await next(); 14 console.log('中間件執行 over'); 15 }); 16 app.listen(3000, () => { 17 console.log('server is running at http://localhost:3000'); 18 });
執行上述代碼,控制檯打印顯示:服務器
server is running at http://localhost:3000
而後打開瀏覽器,訪問http://localhost:3000,控制檯顯示內容更新以下:架構
中間件 doSoming 中間件執行 over 請求地址: /,響應時間:1ms 中間件 doSoming 中間件執行 over 請求地址: /favicon.ico,響應時間:0ms
當服務器接收到HTTP請求後,會以「洋蔥模型」的方式開始流轉。先進入第一個中間件。在上述代碼中,第一個中間件記錄下當前時間戳,而後將控制權向下傳遞,第二個中間件進行相應的邏輯處理,第三個中間件進行相應的邏輯處理……,最後再一層層的返回,直到返回給第一個中間件,而後再次記錄下當前時間戳,記錄的兩次時間戳之間的差值,即爲這次HTTP請求的響應時間。app
可能細心的讀者會發現,控制檯打印了兩條記錄,這是由於訪問http://localhost:3000後,DOM結構在瀏覽器上進行渲染,會發起相應的靜態資源文件的HTTP請求,「/favicon.ico」即爲DOM渲染時默認自帶的靜態資源。koa
另外,讀者能夠思考一下,若是一箇中間件沒有調用await next(),又會發生什麼狀況呢?答案是「後面的中間件將不會執行」。讀者能夠自行驗證一下。async
本節在線視頻地址https://camp.qianduan.group/koa2/2/1/2,二維碼:學習
一塊兒跟我來學習《Koa與Node.js開發實戰》這本書吧。ui