为啥Koa 2.x要多出个ctx?
Posted Node全栈
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为啥Koa 2.x要多出个ctx?相关的知识,希望对你有一定的参考价值。
为啥Koa 2.x要多出个ctx?
这样变化的最主要的原因是,在你写koa apps 时使用async箭头函数的时候:
app.use(async (ctx, next) => { await next()
})
这种情况下,使用this是万万不可能的。
因为 Arrow Function是 Lexical scoping(定义时绑定), this指向定义Arrow Function时外围, 而不是运行时的对象。
正面其实也挺美,O(∩_∩)O哈哈~
引用koa 1.x和2.x 的差异根源
1.x
var koa = require('koa');var app = koa();
2.x
const Koa = require('koa');const app = new Koa();
源码
1.x
/** * Application prototype. */var app = Application.prototype;/** * Expose `Application`. */module.exports = Application;/** * Initialize a new `Application`. * * @api public */function Application() { if (!(this instanceof Application)) return new Application; this.env = process.env.NODE_ENV || 'development'; this.subdomainOffset = 2; this.middleware = []; this.proxy = false; this.context = Object.create(context); this.request = Object.create(request); this.response = Object.create(response);
}
2.x
/** * Expose `Application` class. * Inherits from `Emitter.prototype`. */module.exports = class Application extends Emitter { /** * Initialize a new `Application`. * * @api public */ constructor() { super(); this.proxy = false; this.middleware = []; this.subdomainOffset = 2; this.env = process.env.NODE_ENV || 'development'; this.context = Object.create(context); this.request = Object.create(request); this.response = Object.create(response); }
}
很明显,1.x是函数,而2.x是类,需要new来实例化。
整个Koa2.x里只有application做了类化,其他的还是保持之前的风格,大概还没有到必须修改的时候吧。
全文完
如果想参与评论,请点击原文链接,进入国内最专业的cnode论坛
以上是关于为啥Koa 2.x要多出个ctx?的主要内容,如果未能解决你的问题,请参考以下文章