国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

玩轉Koa之核心原理分析

2024-05-06 15:43:43
字體:
來源:轉載
供稿:網友

Koa作為下一代Web開發框架,不僅讓我們體驗到了async/await語法帶來同步方式書寫異步代碼的酸爽,而且本身簡潔的特點,更加利于開發者結合業務本身進行擴展。

本文從以下幾個方面解讀Koa源碼:

封裝創建應用程序函數 擴展res和req 中間件實現原理 異常處理

 一、封裝創建應用程序函數

利用NodeJS可以很容易編寫一個簡單的應用程序:

const http = require('http')const server = http.createServer((req, res) => { // 每一次請求處理的方法 console.log(req.url) res.writeHead(200, { 'Content-Type': 'text/plain' }) res.end('Hello NodeJS')})server.listen(8080)

注意:當瀏覽器發送請求時,會附帶請求/favicon.ico。

而Koa在封裝創建應用程序的方法中主要執行了以下流程:

組織中間件(監聽請求之前) 生成context上下文對象 執行中間件 執行默認響應方法或者異常處理方法
// application.jslisten(...args) { const server = http.createServer(this.callback()); return server.listen(...args);}callback() { // 組織中間件 const fn = compose(this.middleware); // 未監聽異常處理,則采用默認的異常處理方法 if (!this.listenerCount('error')) this.on('error', this.onerror); const handleRequest = (req, res) => {  // 生成context上下文對象  const ctx = this.createContext(req, res);  return this.handleRequest(ctx, fn); }; return handleRequest;}handleRequest(ctx, fnMiddleware) { const res = ctx.res; // 默認狀態碼為404 res.statusCode = 404; // 中間件執行完畢之后 采用默認的 錯誤 與 成功 的處理方式 const onerror = err => ctx.onerror(err); const handleResponse = () => respond(ctx); onFinished(res, onerror); return fnMiddleware(ctx).then(handleResponse).catch(onerror);}

二、擴展res和req

首先我們要知道NodeJS中的res和req是http.IncomingMessage和http.ServerResponse的實例,那么就可以在NodeJS中這樣擴展req和res:

Object.defineProperties(http.IncomingMessage.prototype, { query: {  get () {   return querystring.parse(url.parse(this.url).query)  } }})Object.defineProperties(http.ServerResponse.prototype, { json: {  value: function (obj) {   if (typeof obj === 'object') {    obj = JSON.stringify(obj)   }   this.end(obj)  } }})

而Koa中則是自定義request和response對象,然后保持對res和req的引用,最后通過getter和setter方法實現擴展。

// application.jscreateContext(req, res) { const context = Object.create(this.context);  const request = context.request = Object.create(this.request);  const response = context.response = Object.create(this.response);  context.app = request.app = response.app = this;  context.req = request.req = response.req = req; // 保存原生req對象  context.res = request.res = response.res = res; // 保存原生res對象  request.ctx = response.ctx = context;  request.response = response;  response.request = request;  context.originalUrl = request.originalUrl = req.url;  context.state = {};  // 最終返回完整的context上下文對象  return context;}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 昆明市| 阿拉尔市| 清丰县| 宁远县| 黄浦区| 安康市| 东辽县| 子洲县| 北碚区| 博野县| 淳化县| 邵东县| 农安县| 巧家县| 闸北区| 山东省| 马公市| 广昌县| 乌恰县| 海兴县| 平阴县| 大庆市| 尤溪县| 临清市| 澄迈县| 陕西省| 涡阳县| 黄浦区| 山阳县| 梁山县| 长岛县| 连云港市| 靖远县| 象州县| 黎城县| 宁都县| 辉县市| 丰都县| 开平市| 和平县| 旌德县|