Koa原理和封裝

2022-09-01 16:45:17 字數 3680 閱讀 2668

最基礎實現乙個簡單的koa2框架

實現乙個簡版koa

koa實踐及其手擼

koa原始碼只有4個js檔案

context.js:**並整合request.js和response.js

request.js:基於原生req封裝的更好用

response.js:基於原生res封裝的更好用

如果我們要封裝乙個koa,

需要實現use載入中介軟體,

next下乙個中介軟體,並且是環形的,

中介軟體是promise的

ctx=>對應常用的是 body(可讀寫)/ url(唯讀)/ method(唯讀)

// 引入 context request, response 模組

const context = require('./context');

const request = require('./request');

const response = require('./response');

/* 建構函式 */

constructor()

// 開啟 http server 並且傳入引數 callback

listen(...args)

use(fn)

callback()

} /**

監聽失敗,監聽的是上面的catch

*/onerror(err)

/*構造ctx

@param req實列

@param res 實列

@return ctx實列

*/createcontext(req, res)

/*響應訊息

@param ctx 實列

*/responsebody(ctx) else if (typeof content === 'object')

} /*

把傳進來的所有的中介軟體函式合併為乙個中介軟體

@return

*/compose()

return promise.resolve(fn(ctx, function next()))}}

} }

// 使用

str += 'hello world'; // 沒有宣告該變數, 所以直接拼接字串會報錯

ctx.body = str;

}); console.log(err);

}); console.log('listening on 3000');

});

優化

如果有乙個中介軟體寫了兩個next,會執行兩次,需要通過判斷next的總執行次數和中介軟體的長度,如果不一樣,就要報錯

環形【洋蔥】有什麼好處

上面的洋蔥圈可能沒看懂,上乙個簡易版的

var arr = [function(next),function(next)]

var i = 0;

function init()

})}init()

// 1342

為什麼是1342

上面的**打個斷點就知道了

// 這樣應該看得懂吧

function()

next()

console.log(2)

}

在以前不是express設計的框架,整個請求到響應結束是鏈結構的,乙個修改響應的外掛程式就需要放到最後面,但是有個環形的設計,只要把要修改響應的**寫到next執行後就行了,對於開發者也是,獲取請求的資料,修改請求的資料,next,查資料庫,響應body

檔案訪問中介軟體

module.exports = (dirpath = "./public") => 

` );

} else

` );

}});

ret.push("

"); ctx.body = ret.join("");

} else

} catch (e)

} else

}}// 使用

const static = require('./static')

路由中介軟體

class router 

// 每次定義乙個路由,都註冊一次

register(path, methods, middleware)

this.stack.push(route);

}// 現在只支援get和post,其他的同理

get(path, middleware)

post(path, middleware)

//呼叫

routes()

}if (typeof route === 'function')

await next();};}

}module.exports = router;

// 使用

const koa = require('koa')

const router = require('./router')

const router = new router();

router.get('/index', async ctx => );

router.get('/post', async ctx => );

router.get('/list', async ctx => );

router.post('/index', async ctx => );

// 路由例項輸出父中介軟體

koa中介軟體原理 之 手寫koa

早期沒有koa與expess之前,所有的請求響應只能在http.createserver中完成 返回請求狀態碼 res.end 返回根目錄頁面給瀏覽器 else if req.url about res.end 返回 about目錄頁面給瀏覽器 server.listen 3000,const ko...

Koa封裝MySQL資料庫

以下提供乙個node.js封裝的mysql資料庫的方法,歡迎各位碼農複製貼上!首先是封裝的資料庫檔案config.js var mysql require mysql 建立鏈結 function connection connection.connect return connection expo...

koa和express比較 以及 koa原始碼解讀

koa 使用的是async await等待 經典句型 await next 類似堆疊先進後出 引數 ctx,next express 是逐步流下去的,走到最後都不匹配,資源返回404,xhr返回500 引數 req,res,next 原始碼解讀 待補充 new koa 時候自動執行了construc...