koa框架

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=
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。