Koa

作者: kzc爱吃梨 | 来源:发表于2022-02-27 23:44 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/yepwlrtx.html