Koa

Koa对比Express

编程模型不同

  • Express的中间件是线型的**
  • Koa的中间件是U型的(后面会讲)


    Koa的中间件模型

对语言特性的使用不同

  • Express使用回调函数 next()
  • Koa v1.x使用 generator语法
  • Koa v2.x使用 async/await语法

示例代码
记录返回hello world的总耗时

import Koa from 'koa'

const app = new Koa()

app.use(async (ctx, next) => {
    //  空
    await next();
    const time = ctx.response.get('X-Response-Time');  //  读取response header
    console.log(`${ctx.url} - ${time}`);
});

app.use(async (ctx, next) => {
    const start = Date.now();  //  记录开始时间
    await next();
    const time = Date.now() - start;  //  记录结束时间 - start = 总耗时
    ctx.set('X-Response-Time', `${time}ms`);  //  写到response header里
});

app.use(async ctx => {
    ctx.body = 'Hello World';
    // 最后一个中间件可以不写 await next()
});

app.listen(3000, ()=> {
    console.log('listen 3000')
})
运行顺序
  • 1后面的 await next() 会等待4执行完毕
  • 2后面的 await next()会等待3执行完毕

await next()是什么意思

释义

app.use(async(ctx,next)=> {
    const start = Date.now();
    await next();  // 等待 下一个中间件()
    const time = Date.now() - start;
    ctx.set('X-Response-Time',`${time}ms`)
})
  • next()表示进入下一个函数
  • 下一个函数会返回一个Promise对象,称为p
  • 下一个函数所有代码执行完毕后,将p置为成功
  • await会等待p成功后,再回头执行剩余的代码

await next()改写

改写成Promise 写法

app.use(async (ctx, next) => {
    const start = Date.now();
    return next().then(() => {
        const time = Date.now() - start;
        ctx.set('X-Response-Time', `${time}ms`)
    })
})
  • 定要写 return,因为中间件必返回 Promise对象
  • 错误处理在这里写有点反模式,用app.on('error')更方便一点

app.xxx

文档在此

ctx.xxx

文档在此

ctx.request.xxx

文档在此

ctx.response.xxx

文档在此

你可能感兴趣的:(Koa)