读源码系列:koajs

koajs是一个基于node的web框架,通过 async/await(es7) 函数,以优雅的方式实现了一套编写web服务程序的方法。

在解读koajs之前,先了解下node原生处理web的方式。

const http = require('http')
const server = http.createServer((req , res) => {
    res.write('hello world')
    res.end()
})
server.listen(8080)

http.createServer 需要绑定request事件的处理函数。koajs所做的工作便是发生在 请求进入 到 结束响应 之间的过程。

1. 源码解析

koajs的代码十分精炼,共有四个文件,一般开发需要结合其他扩展插件使用以解决路由、静态文件、缓存等问题。

response / request

这两对象是对原始 req 和 res 的扩展,借此可以快速读取/设置 属性、方法。

context

context 代理了response / request 中的属性和方法,并设置了默认的error处理函数。本质是请求的上下文。

applocation

用于创建服务。其提供的public api 有 listen / use / callback

app.listen 用于侦听端口,是 http.createServer(app.callback()).listen(8080) 的一个快捷方式。

app.use 用于添加中间处理函数(中间件)。

当有请求进入时,app.callback 会被执行,koa将生成此次请求的ctx对象,并按顺序先后通过中间处理函数,koa在此处使用compose将所有中间件组合为一个函数,ctx会作为第一参数传递进此组合函数。

const compose = (middlewares) {
return (context) => middlewares.reduce( (a, b) => () => Promise.resolve(b(context,a)), () => {})(context)
}

中间件执行完毕后,流程进入 respond 方法做最后一次处理,特殊statusCode、method、不同类型的body输出的方式都有不同。

在res.end() 后,此次请求便结束了。

2. 异常处理

异常可能发生在中间件处理过程中,也可能是原生异常(诸如连接重置等)。koajs 在 handleRequest 中 分别处理了这两种异常,第一种通过try/catch 方式处理,原生异常则通过绑定socket上的error事件处理。

异常发生时,context.onerror 将会响应,输出错误信息,在次之前 context 将在app上派发error事件,用户可主动捕获。若用户未监听error事件,koajs 默认会使用app.onerror 处理异常。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注