记录一下让自己有所收获的两点
1.context属性的拓展
- context
- req
- res
- request
- req
- response
- res
koa在context上直接拓展了原生req、res的属性,同时也在request、response上拓展了原生req、res的属性.
同时也给context以及request、response拓展url、heanders等属性,方便使用。但是写法比较有趣:
//当访问的时候,我们定义了get方法,相当于简写defineProperty,返回自身的req属性的url属性
let request = {
get url(){
return this.req.url
}
}
console.log(context.request.url)
//response同理,不过我发现只要自定义get、set自己就得哪一个变量暂时的保存set的值,以便在get的时候返回去
let response = {
get body(){
return this._body;
},
set body(value){
this._body = value;
}
}
response.body = 123;
console.log(context.response.body)
//context其实也是一样的,只不过用api的形式定义的get set
let context = { };
function defineGetter(target,property) {
context.__defineGetter__(property,function () {
return this[target][property]
});
}
function defineSetter(target,property) {
context.__defineSetter__(property,function (value) {
this[target][property] = value
})
}
defineGetter('request','path');
defineGetter('response','body');
// ctx.body = ctx.response.body;
defineSetter('response','body')
context.body = 123;
console.log(context.body)
console.log(context.path)
2.组合中间件的执行
app.use(async (ctx, next) => {
console.log(1);
await next(); // 调用这个函数的时候 就是当前第二个函数不一定执行完了
console.log(2);
});
app.use(async (ctx, next) => {
console.log(3);
await log()
await next();
console.log(4);
})
//我们在执行中间件函数的时候,把await next给替换成了await () => dispatch(index+1)
//实际上就是await () => Promise.resolve(middlewares[index]())
//或者await () => if(index === middlewares.length) return Promise.resolve();
compose(ctx, middlewares) {
function dispatch(index) {
if (index === middlewares.length) return Promise.resolve();
let fn = middlewares[index]
return Promise.resolve(fn(ctx, () => dispatch(index + 1)));
}
return dispatch(0)
}
tips: Promise.resolve如果里面传的是个promise,会等待里面的promise成功或者失败了以后才会执行它自己的then