參考23課koa2源碼解讀_第1頁
參考23課koa2源碼解讀_第2頁
參考23課koa2源碼解讀_第3頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、源碼解源碼解koa理: 常見koao間件的實前準堂目手寫手寫ico間koaApplicationo間件機常見o間/ const http = class listen(.args) const server = res) = this.callback(req, this.callback(req, this.callback = module.exports = / 調(diào)用,const KKB = const app = new app.use(req, res) res.writeHead(200); app.listen(3000, () 端封裝request1response和/ req

2、uest.js module.exports = get return this.r / response.js module.exports = get body() return set this._body = / context.js module.exports = get url() return get body() return set get body() return set this.response.body = / / 導(dǎo)入這Onconst context = require(./context); const request = const response = c

3、lass listen(.args) const server = http.createServer(req, res) = / PQlet ctx = this.createContext(req, / / / PQ文, 把res和req都d載rctx之P 并且在 qsrconst ctx = Object.creat (co pctx.request = t ( t ctx.response Obje )ctx.req = ctx. ctx.res = ctxreturn qtp/ app.js ctx.body = o間_步o間件:要支casync + await的o間件,要等_步結(jié)束

4、_步o間件:要支casync + await的o間件,要等_步結(jié)束function return function() return / 執(zhí)行第function dispatch( ) let fn = middl wif (!fn) return return Promise. fn(function next() (/ promise完成,再執(zhí)行Q一return dispatch(i + async function console.log(fn1); await next(); console.log(end fn1);async function await delay();await

5、 console.log(end function functionawait console.log(end function function delay() return new Promise(reslove, reject) setTimeout() , = const middlewares = const finalFn = comfn1, fn2, e用在const http = context = request = response = require(./res )KKB / _始化o間件數(shù) listen(.args) const server = http const

6、ctx = / ot t C ( sync (req, res) t(req, const fn = po ( / 函數(shù)并傳入PQawait fn(ctx); use(middleware) / 將o間件r函e(middlewares) return function(ctx) / 傳入PQreturn dispatch(0); function dispatch(i) let fn = if (!fn) return return if (!fn) return return fn(ctx, function next() / 將PQ文傳入o間件,mid(ctx,next) return d

7、ispatch(i + 1);createContext(req, res) let ctx = Object.create(context); ctx.request = Object.create(request); ctx.response = ctx.req = ctx.request.req = ctx.res = ctx.response.res = res; return ctx;module.exports = 用function sleep() return new Promise(reslove setTimeout() = , japp.use(async ody = 1

8、; setTimeout() ctx.body += , await next(); ctx.body += 3;app.use(async (ctx, next) ctx.body += 4; await delay(); await next(); ctx.body += 5;app.use(async (ctx, next) ctx.body += e的常見koao間件的實實現(xiàn)loggeromodule.exports = async function(ctx, nexte的常見koao間件的實實現(xiàn)loggeromodule.exports = async function(ctx, n

9、ext) 操作請求 const start = new Date().getTime() console.log(start: $ctx.url); await next();const end = new Date().getTime() console.log(請求$ctx.url, 耗時(end-請將module.exports = async function(ctx, const res, req = ctx; const blackList = ;const ip = / 出現(xiàn)在黑單o將if (blackList.includes(ip) ctx.body = not allowe

10、d; else await function return q) / 判斷是否有反/ 判斷 connection / 判斷端的 socket 的 req.headersx-f w d d req.connection.rem t Add req.socket.remoteAd r/ app.listen(3000, , () = 端口靜態(tài)文件服koa-/ const fs = require(fs); const path = require(path);module.exports = (dirPath = ./public) return async (ctx, next) = if (c

11、tx.url.module.exports = (dirPath = ./public) return async (ctx, next) = if (ctx.url.indexOf(/public) = 0) / public_頭 取文url = path.resolve( dirname, aseName = filepath = url + ctx.url.replace(/public, / console.log(ctx.url,url, filepath, fitry s = if s.isDirectory() const dir = / const ret = ; dir.fo

12、rEach(filename = 簡單認不帶小數(shù)點的格式,就是文件夾if (filename.indexOf(.) - $filename else / $ret.push( /d else )t console.log( 文件 const content = ctx.body = catch (e) / 報錯了 文件不存ctx.body = 404, not else / 否則不是靜態(tài)資源,直接Q一noawait /const ic = /const ic = 路由 routes()的返回值是一no間件,由于需要用rtd所以需要d載trctx之P,修改module.exports get r

13、eturn get return class constructor() this.stack = ;ath, methods, middlew r let route = path, methods, dd w / 現(xiàn)在只支cgett,其get(path,middleware this.register( thg )t(path,midd this.regist (p dd routes() let stock = this.sta return async function(ctx, let currentPath = ctx.url; let route;for (let i = 0; i = 0) / 判斷path和method route = item.middleware;if (typeof route = route(ctx, next); await module.exports = const Koa = requireawait module.exports = const Koa = require(./kkb) const Router = require(./router) const app = new Koa()con

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論