koa2

1.get started

//1 npm init -y
//2 npm i koa

//3 hello world
const Koa = require('koa')
const app = new Koa()

app.use(async ctx => {
	ctx.body = `hello koa2`
}).listen(3000, _ => {
	console.log('server is starting at port 3000')
})
//4 run
node xxx.js

ctx

ctx作为上下文使用,Koa 将 node 的 request, response对象封装进一个单独对象。即ctx.request 、 ctx.response。Koa 内部又对一些常用的属性或者方法做了代理操作,使得我们可以直接通过 ctx 获取。比如,ctx.request.ur以写成ctx.url

除此之外,Koa 还约定了一个中间件的存储空间ctx.state。通过 state 可以存储一些数据,比如用户数据,版本信息等。如果你使用 webpack 打包的话,可以使用中间件,将加载资源的方法作为 ctx.state 的属性传入到 view 层,方便获取资源路径

next

next 参数的作用是将处理的控制权转交给下一个中间件

2.koa2 特性

  • 只提供封装好 http 上下文、请求、响应,以及基于async/await的中间件容器

  • 利用 ES7 的async/await的来处理传统回调嵌套问题和代替 koa@1 的 generator,但是需要在 node.js 7.x 的 harmony 模式下才能支持async/await

  • 中间件只支持 async/await 封装的,如果要使用 koa@1 基于 generator 中间件,需要通过中间件 koa-convert 封装一下才能使用

3.koa2 中间件开发(顺序)

  1. generator 中间件,用在 koa1

  2. generator 中间件在 koa@2 中的使用,需要用 koa-convert 封装一下

  3. async 中间件

4.路由(koa-router)

example

router.all

命名路由

多中间件

嵌套路由

路由前缀(前缀是一个固定的字符串,不能添加动态参数)

URL 参数

5.请求数据获取

get

post

注意:ctx.requestcontext经过封装的请求对象,ctx.reqcontext提供的node.js原生 HTTP 请求对象,同理ctx.responsecontext经过封装的响应对象,ctx.rescontext提供的node.js原生 HTTP 请求对象

koa-bodyparser

6.静态资源加载

一个 http 请求访问 web 服务静态资源,一般响应结果有三种情况

  • 访问文本,例如 js,css,png,jpg,gif

  • 访问静态目录

  • 找不到资源,抛出 404 错误

原生实现

koa-static

7.cookie/session

koa2 使用 cookie

koa 提供了从上下文直接读取、写入 cookie 的方法

  • ctx.cookies.get(name, [options]) 读取上下文请求中的 cookie

  • ctx.cookies.set(name, value, [options]) 在上下文中写入 cookie

koa2 中操作的 cookies 是使用了 npm 的 cookies 模块,所以在读写 cookie 的使用参数与该模块的使用一致

koa2 使用 session

  • 如果 session 数据量很小,可以直接存在内存中

  • 如果 session 数据量很大,则需要存储介质存放 session 数据

  • koa-session-minimal适用于 koa2 的 session 中间件,提供存储介质的读写接口

  • koa-mysql-sessionkoa-session-minimal中间件提供 MySQL 数据库的 session 数据读写操作

8.常用中间件

  • reify

  • koa-conditional-get

  • koa-etag

  • koa-bodyparser

  • koa-static

  • koa-views

  • koa-mount 通过 URL 挂载,将其他 Koa 实例挂在到一个主实例中

  • koa-connect 兼容 Express 中间件可以在 Koa 中使用

9.view

ejs

  1. 安装 koa 模板使用中间件npm i koa-views

  2. 安装ejs模板引擎npm i ejs

Nunjucks

grammar

  • variable {{ username }} {{ foo.bar }} {{ foo["bar"] }} 如果变量的值为 undefinednull 不显示

  • filter {{ foo | title }} {{ foo | join(",") }} {{ foo | replace("foo", "bar") | capitalize }}

  • if

var items = [{ title: "foo", id: 1 }, { title: "bar", id: 2}]

Posts

```

  • macro

{{ field('user') }} {{ field('pass', type='password') }}

//layout.html

//home.html

```

10.upload

busboby

上传文件简单实现

异步上传图片实现

11.integrated with MySQL

mysql

创建数据连接池

async/await 封装使用 mysql

建表初始化

12.jsonp

原生 koa2 实现 jsonp

koa-jsonp

挂载 jsonp 返回格式到 ctx

13.unit test

  • mocha 模块是测试框架

  • chai 模块是用来进行测试结果断言库,比如一个判断 1 + 1 是否等于 2

  • supertest 模块是 http 请求测试库,用来请求 API 接口

14.log4js

log4js middleware

挂载应用日志到 ctx

抽出可配置量

丰富日志信息

项目自定义内容

对日志中间件进行错误处理

15.错误处理

抽取中间件并引入

渲染页面逻辑

16.规范与部署

  • nodemon自动重启(全局本地都安装)

  • pm2Node 应用的进程管理器

Last updated