1. 环境依赖
- 最新的koa建议使用es6,await, async;所以我们这里的环境使用node v8.0.0
nvm install v8.0.0
npm i koa -D
2. hello world
const Koa = require('koa');
const app = new Koa();
app.use(async ctx=> {
ctx.body = "Hello world"
})
app.listen(3000);
3. 中间件执行流程
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx, next)=> {
await next();
console.log(111)
})
app.use(async ctx => {
ctx.body = "到底了";
console.log(22);
})
app.listen(3000);
//打印结果
//22
//111
ps: 执行流程是,中间件从上到下执行;当某个中间件遇到了await,会停止await下面的代码,转而执行下一个中间件,直到最后一个中间件执行完了,或者某个中间没有await,则执行流程将回流,回复其上游行为
4. app.listen(...)
- 创建并返回HTTP服务器
const Koa = require('koa")
const app = new Koa();
app.listen(3000)
ps: 以上就创建了一个简单的http服务器
5. app.use(...)
-添加一个中间件,也可以放入第三方中间件模块
app.use(async (ctx, next)=> {
await next();
ctx.body="hello world"
})
6. app.context
- 是创建ctx的原型,可以在app.context上面添加属性,在ctx可以获取到
app.context.name= 'weixin';
app.use(async ctx => {
console.log(ctx.name);
})
7. 错误处理
- 默认当发生错误的时候,所有错误会输出到stderr,作为输出流输出到屏幕中;我们可以添加’error‘监听器,当发生错误的时候,将错误信息记录出来
app.on('error', (error, ctx) => {
log.error('server error', err, ctx)
})
8. 上下文(Context)
- Koa Context将nodejs的requrest和response对象封装到单个对象中
- 每个请求都会创建一个Context,并且在中间中作为形参ctx来引用
app.use(async ctx => {
ctx; //这是每个请求过来创建的Context
ctx.request; //这是requrest
ctx.response; //这是response
})
9. ctx上面的属性
ctx.req //node的request,没有经过处理
ctx.res //node的response
ctx.request //Koa的requrest
ctx.response //Koa的response
ctx.state //命名空间,用来传递中间件传递信息和前端视图
ctx.state.userInfo = await getUserInfo();
ctx.app //应用实例的引用
....
Koa Request
- 该对象是对node的request的抽象封装,包含以下属性
request.header //请求头
request.header= //设置请求头
request.method //请求方法
request.length //以数字返回请求里面的Content-Length
request.url //获取请求的url
requret.url = //设置请求url, 对url重写有用
request.origin //获取url的来源,包括protocol和host
ctx.request.origin => http://test.com
request.href //获取完整的url,包括protocal,host,url
ctx.request.href => http://test.com/foo/bar?q=1
request.path // 获取请求路劲
request.querystring //获取查询字符串
request.host //获取当前主,当app.proxy设置为true时支持X-Forwarded-Host, 否则使用Host
request.type //获取请求Content-type
,不包含参数charset
const ct=ctx.request.type => image/png
request.charset //获取请求字符集
ctx.request.carset => 'utf-8'
request.query //获取解析后的查询字符串
color=blue&size=small
得到的是
{
color: 'blue',
size: 'small'
}
request.protocol //返回请求协议
request.ip //返回远程地址, 当app.proxy是true时支持X-Forwarded-Proto.
ps: 可以参考这里https://koa.bootcss.com/
ctx.request对象里面属性的别名
ctx.header
ctx.headers
ctx.method
ctx.method=
ctx.url
ctx.url=
ctx.originalUrl
ctx.origin
ctx.href
ctx.path
ctx.path=
ctx.query
ctx.query=
ctx.querystring
ctx.querystring=
ctx.host
ctx.hostname
ctx.fresh
ctx.stale
ctx.socket
ctx.protocol
ctx.secure
ctx.ip
ctx.ips
ctx.subdomains
ctx.is()
ctx.accepts()
ctx.acceptsEncodings()
ctx.acceptsCharsets()
ctx.acceptsLanguages()
ctx.get()
ctx.response对象里面属性的别名
ctx.body
ctx.body=
ctx.status
ctx.status=
ctx.message
ctx.message=
ctx.length=
ctx.length
ctx.type=
ctx.type
ctx.headerSent
ctx.redirect()
ctx.attachment()
ctx.set()
ctx.append()
ctx.remove()
ctx.lastModified=
ctx.etag=