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
- koa-compose https://github.com/koajs/compose middleware的工作原理.
一个简化版的
koa-compose
```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);
}
} ```
- node-delegates 用来将context.request委托在context身上 etc
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');
- on-finished https://github.com/jshttp/on-finished
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 的中间件洋葱圈:所有的请求经过一个中间件的时候都会执行两次,方便实现后置处理逻辑