koa原始碼部分解析 1 本體

2021-09-26 19:11:50 字數 2090 閱讀 2945

koa自身的**比較少,但是有很多依賴的npm包,有不少是在jshttp這個project裡(比如on-finished)。

版本2.7.0

先來看乙個使用koa的例子

const koa = require('koa');

const fs = require('fs');

function render(page) `;

fs.readfile(viewurl, 'binary', (err, data) => else

});});

}async function route(url)

let html = await render(view);

return html;

} let url = ctx.request.url;

let html = await route(url);

ctx.body = html;

});

this.context = object.create(context);

this.request = object.create(request);

this.response = object.create(response);

listen函式用node的http模組的createserver函式建立了server例項,並進行監聽

listen(...args)
呼叫createserver的時候,傳入了this.callback(),我們來看一下。

callback返回了乙個函式,這個函式先呼叫了createcontext,然後返回了handlerequest成員函式

callback() ;

return handlerequest;

} handlerequest(ctx, fnmiddleware)

createcontext(req, res) ;

return context;

}

提供了乙個相對具體的onerror,乙個cookie讀寫屬性,另外全是**了request和response的方法和屬性,**方法是使用delegates這個包,這個包的核心是__definegetter____definesetter__這兩個方法,當然現在都建議用object.defineproperty了。

沒什麼和流程相關的**,基本都是和http請求相關的內容,可以掃一眼,遇到問題了再看

body和set可以看一看。

set用的是setheader方法,和writeheader有挺多不一樣的地方,具體可以查閱node文件。

function respond(ctx) 

if ('head' == ctx.method)

return res.end();

} // status body

if (null == body) else

if (!res.headerssent)

return res.end(body);

} // responses

if (buffer.isbuffer(body)) return res.end(body);

if ('string' == typeof body) return res.end(body);

if (body instanceof stream) return body.pipe(res);

// body: json

body = json.stringify(body);

if (!res.headerssent)

res.end(body);

}

*****這些是我寫了koa-router之後回來寫的

koa的本體**不多,但是看了它的中介軟體以後發現還是需要了解一下哪些能力是本體提供的,有時候中介軟體調了一下ctx.***你都不知道這個***是**來的,所以一上來可以不用把本體看的特別熟悉,遇到了問題可以再回頭來看,順便所有的中介軟體都存到了middleware裡面,除錯的時候很方便檢視

koa2原始碼解析

koa版本2.4.1 以如下示例 進行說明 const koa require koa 1.執行建構函式 2.註冊中介軟體 ctx.body hello world 3.啟動指定埠的http服務 複製 1.建構函式constructor 複製 2.註冊中介軟體use fn 複製 3.啟動指定埠的ht...

koa1 原始碼詳解1

koa的核心設計 是由 koa 與 koa compose兩個包構成的。包含了 上下文context的建立引用,中介軟體的概念及其合併執行的機制。koa1.0中直接將context繫結到了中介軟體中的this引用,koa2.0 將context作為引數傳給中介軟體 建立context 巧妙的是用到d...

KOA中介軟體原始碼解析

告別 噩夢,從這裡開始 請看下面來自官網的 和執行順序 以上 的實現如果用 函式來實現,無疑是一場噩夢,而koa卻以十分優雅的方式實現了如下圖洋蔥圖一般的 核心是利用es6的新特性 generator 具體實現是利用koa的兩個niubi轟轟的模組 compose和cocompose模組,用於將所有...