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 处理异常。
文章评论