koa学习笔记
准备
Koa是一种Web框架。
由Express原班人马打造的koa,致力于成为一个更小、更健壮、更富有表现力的Web框架。使用koa编写web应用,通过组合不同的generator,可以免除重复繁琐的回调函数嵌套,并极大地提升常用错误处理效率。Koa没有捆绑任何中间件,它仅仅提供了一个轻量优雅的函数库,使得编写 Web 应用变得得心应手。
Koa is a new web framework designed by the team behind Express, which aims to be a smaller, more expressive, and more robust foundation for web applications and APIs. Through leveraging generators Koa allows you to ditch callbacks and greatly increase error-handling. Koa does not bundle any middleware within core, and provides an elegant suite of methods that make writing servers fast and enjoyable.
Koa需要node 7.6.0以上的版本,以支持ES6和async
方法。
Hello World
下面是官网的例子
1 | const Koa = require('koa') |
Koa应用程序
在执行new Koa()
时创建的对象被称为Koa应用对象。
应用对象是带有node http服务的Koa接口。它可以处理中间件的注册,将http请求分发到中间件,进行默认错误处理,以及应对上下文,请求和响应对象进行配置。
上面的代码架设了一个http服务,监听3000端口。
中间件
Koa 是一个中间件框架,可以采用两种不同的方法来实现中间件:
- async function
- common function
上面的代码用的是async function(node v7.6+)。
中间件通常带有两个参数(ctx, next),ctx是一个请求的上下文(context),next是调用执行下游中间件的函数,在代码执行完成后通过then
方法返回一个Promise
。
级联代码
Koa 中间件以一种非常传统的方式级联起来,如下面的例子,代码执行的顺序如注释。
1 | const Koa = require('koa') |
一开始,用户的请求通过x-response-time和logger中间件。这两个中间件记录了一些请求细节。然后“穿过”response 中间件一次,最终结束请求,返回“Hello World”。
当程序运行到await next()
时,代码流会暂停执行这个中间件到剩余代码,转而切换到下一个被定义的中间件执行代码,这样切换控制权的方式,被称为downstream,当没有下一个中间件执行downstream的时候,代码会逆序执行(回到await next()
执行下一行)。
“级联”这个词许多人也许在CSS中听说过,如果你不能理解为什么在这里使用这个词,可以将这种路由结构想象成LESS的继承嵌套书写方式。
下面的“洋葱”图更能形象地表达。用户的请求先后经过登陆管理,状态码重定向,错误处理,cache缓存中间件,session会话中间件,routes路由中间件,应用。响应逆向经过这些步骤传递出去。
Context(内容)
每个中间件都接受一个Koa的Context
对象。Context
将 node 的request
和response
对象封装到单个对象中。ctx
通常用作上下文对象的参数名称。
ctx.request
Koa提供了一个Request
对象作为Context
的request
属性,即ctx.request
。 Koa的Request
对象提供了用于处理 http请求的方法,该请求委托给 nodehttp
模块的IncomingMessage。
下面是一个检查请求客户端xml支持的示例。
1 | app.use(async (ctx, next) => { |
ctx.response
Koa提供了一个Response
对象作为Context
的response
属性,即ctx.response
。 Koa的Response
对象提供了用于处理http
响应的方法,该响应委托给ServerResponse。
下面是一个使用Koa的`Response`对象将文件作为响应体流式传输的示例(返回一个页面)。
1 | app.use(async (ctx, next) => { |
更详细的API参阅请求 API 参考, 响应 API 参考和上下文 API 参考。
koa-router
koa-router是koa的路由中间件。
可以先看一下原生路由和koa-router
的基本用法的对比。
1 | // 原生路由 |
1 | // koa-route |
router.get|put|post|patch|delete|del ⇒ Router
1 | router |
多个中间件
1 | router.get( |
嵌套路由
1 | const forums = new Router() |
路由前缀
1 | const router = new Router({ |
URL参数
命名的路由参数会被捕获,并被添加到ctx.params
里
1 | router.get('/:category/:title', (ctx, next) => { |
关于koa-router
更多介绍参阅koa-router。