内容简介:第一篇文章中我们讲过,“在Koa中,中间件是指连贯整个 Koa 应用程序,并共享资源的独立插件”,注意两个词,“连贯”与“共享资源”,与上面的代码一一对应,“连贯”对应“next”,“共享资源对应context”。Koa 中通过 context 处理上下文,下面分析一下 context。不停的创建调用 context 对象,避免对context产生影响,初始 context 对象使用 Object.create() 来克隆对象
第一篇文章中我们讲过,“在Koa中,中间件是指连贯整个 Koa 应用程序,并共享资源的独立插件”,注意两个词,“连贯”与“共享资源”,与上面的代码一一对应,“连贯”对应“next”,“共享资源对应context”。
Koa 中通过 context 处理上下文,下面分析一下 context。
context 初始创建
createContext(req, res) { const context = Object.create(this.context); const request = context.request = Object.create(this.request); const response = context.response = Object.create(this.response); ... context.state = {}; return context; }
不停的创建调用 context 对象,避免对context产生影响,初始 context 对象使用 Object.create() 来克隆对象
context 中包含了几个个主要属性,其中比较重要的有request、response、state。
Koa 中 分别提供 request.js 与 response.js 对原生 req 与 res 对象进行了处理,使得更易操作,例如在request.js 中将 req 原始请求参数由字符串类型替换为对象类型,“?a=1&b=2” <=> {a: 1, b: 2}。
delegates
为了简化对于 context 的操作,Koa中 把 context 中需要调用的方法和属性读取,进行了委托。
有兴趣的可以研究研究 delegates 这个库。
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');
例如我们常用的 “ctx.redirect(xxx)” 方法等同于 ctx.reponse.redirect(xxx);
例如输出内容 ctx.body = ‘xxx’ 等同于 ctx.response.body = ‘xxx’;
set & get 处理
对于context中的部分值的设置,进行了 set get 处理,例如 body 对象
get body() { return this._body; }, set body(val) { const original = this._body; this._body = val; if (this.res.headersSent) return; // no content if (val == null) { if (!statuses.empty[this.status]) this.status = 204; this.remove('Content-Type'); this.remove('Content-Length'); this.remove('Transfer-Encoding'); return; } // set the status if (!this._explicitStatus) this.status = 200; // set the content-type only if not yet set const setType = !this.header['content-type']; // string if (typeof val == 'string') { if (setType) this.type = /^\s*</.test(val) ? 'html' : 'text'; this.length = Buffer.byteLength(val); return; } // buffer if (Buffer.isBuffer(val)) { if (setType) this.type = 'bin'; this.length = val.length; return; } // stream if (typeof val.pipe == 'function') { onFinish(this.res, destroy.bind(null, val)); ensureErrorHandler(val, this.ctx.onerror); // overwriting if (original != null && original != val) this.remove('Content-Length'); if (setType) this.type = 'bin'; return; } // json this.remove('Content-Length'); this.type = 'json'; }
当我们通过 ctx.body 设置输出内容的时候实际上在 Koa 内部进行了一系列处理,例如设置 body 未 null 的情况下,会将 Http 返回状态设置为204。
总体来说,Koa 中关于 context 的源码初看比较复杂,实际上是非常简洁易明的。
参考资料
以上所述就是小编给大家介绍的《Koajs中间件之定义(三)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- Koajs中间件之定义(二)
- Koajs中间件之定义(一)
- 自定义 Traefik2 中间件
- 在Ocelot中使用自定义的中间件(一)
- asp.net core 3.1 自定义中间件实现jwt token认证
- node.js – passport.initialize()中间件未用于快速4.10的自定义回调
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Data Mining
Bing Liu / Springer / 2006-12-28 / USD 59.95
Web mining aims to discover useful information and knowledge from the Web hyperlink structure, page contents, and usage data. Although Web mining uses many conventional data mining techniques, it is n......一起来看看 《Web Data Mining》 这本书的介绍吧!