Skip to content

koa

万能开局

const fs = require('fs');
const Koa = require('koa');
const Router = require('@koa/router');
const cors = require('@koa/cors');
const { koaBody } = require('koa-body');

const app = new Koa();
const router = new Router();

app
  .use(koaBody())
  .use(router.routes())
  .use(router.allowedMethods())
  .use(cors({
    origin: '*'
  }))
  .use(require('koa-static')(__dirname + '/static'));

router.post('/msg', async (ctx, next) => {
    ctx.body = JSON.stringify({ data: 'hello' })
    await next();
  });

app.listen(3000, ()=>{
  console.log('app listen')
});

相关 source

```javascript function compose(middlewares){ return function(ctx) { function dispatch(i) { i+=1; const fn = middlewares[i] try { return fn ? Promise.resolve(fn(ctx, dispatch.bind(null, i+ 1))) : Promise.resolve(); } catch (e) { return Promise.reject(err) } }

    return dispatch(0);
  }

} ```

https://juejin.im/post/5b9339136fb9a05d3634ba13

作用:控制对象的属性权限,比如不能手动调用res.end()。其实就是做对象代理,内地里通过Object.prototype.defineGetter()和Object.prototype.defineSetter()工作。使用场景如下:

delegate(proto, 'response')
  .method('attachment')
  .method('redirect')
  .method('remove')
  .method('vary')
  .method('set')
  .method('append')
  .method('flushHeaders')
  .access('status')
  .access('message')
  .access('body')
  .access('length')
  .access('type')
  .access('lastModified')
  .access('etag')
  .getter('headerSent')
  .getter('writable');

http vs express vs koa

  • 请求时

h: res.write()可以write好多次 客户端收到的数据会叠加 最后用res.end()结尾

e: res.send()。但是get里要res.end() post里不必

k: ctx.body='xxx'。可以修改!以最后的ctx.body为准!

  • Koa 的中间件洋葱圈:所有的请求经过一个中间件的时候都会执行两次,方便实现后置处理逻辑