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.jsctx
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 中间件开发(顺序)
4.路由(koa-router)
example
router.all
命名路由
多中间件
嵌套路由
路由前缀(前缀是一个固定的字符串,不能添加动态参数)
URL 参数
5.请求数据获取
get
post
注意:ctx.request是context经过封装的请求对象,ctx.req是context提供的node.js原生 HTTP 请求对象,同理ctx.response是context经过封装的响应对象,ctx.res是context提供的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-session为koa-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
安装 koa 模板使用中间件
npm i koa-views安装ejs模板引擎
npm i ejs
Nunjucks
grammar
variable
{{ username }} {{ foo.bar }} {{ foo["bar"] }}如果变量的值为undefined或null不显示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