国产探花免费观看_亚洲丰满少妇自慰呻吟_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;}            
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 南靖县| 珲春市| 祁东县| 麟游县| 祁东县| 桐庐县| 都匀市| 融水| 双桥区| 德庆县| 南皮县| 鹿邑县| 淳化县| 上虞市| 弋阳县| 图片| 齐河县| 池州市| 大竹县| 灵宝市| 武穴市| 洪泽县| 抚顺市| 枣阳市| 寿宁县| 白水县| 庄浪县| 岑溪市| 塘沽区| 深州市| 盖州市| 尼木县| 石家庄市| 甘孜县| 彩票| 六枝特区| 葫芦岛市| 泌阳县| 上林县| 镇赉县| 佳木斯市|