koa:当创建一个服务时,做了什么
来源:互联网 发布:笔记本安装mac系统 编辑:程序博客网 时间:2024/05/29 11:00
创建一个简单的应用
// 1、实例化appvar Koa = require('koa');const app = new Koa();// 2、声明中间件函数async function responseTime(ctx, next) { const start = new Date(); await next(); const ms = new Date() - start + 10; ctx.set('X-Response-Time', `${ms}ms`);}async function responseContent(ctx, next) { if ('/' != this.url) return; ctx.body = 'Hello World!';}// 3、使用中间件app.use(responseTime);app.use(responseContent);// 4、应用监听端口app.listen(3000);
app对象
const Emitter = require('events');class Application extends Emitter { 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); } }
app.use()添加中间件时做了什么
use(fn) { // 省略fn判断 this.middleware.push(fn); return this; }
app.listen(3000)监听端口
listen() { const server = http.createServer(this.callback()); return server.listen.apply(server, arguments); } callback() { // 返回一个用于dispatch中间件的函数,默认从index = 0开始 const fn = compose(this.middleware); if (!this.listeners('error').length) this.on('error', this.onerror); return (req, res) => { res.statusCode = 404; // 使用请求和响应对象创建上下文对象 const ctx = this.createContext(req, res); onFinished(res, ctx.onerror); // 执行中间件函数并响应 fn(ctx).then(() => respond(ctx)).catch(ctx.onerror); }; }function compose (middleware) { if (!Array.isArray(middleware)) throw new TypeError('Middleware stack must be an array!') for (const fn of middleware) { if (typeof fn !== 'function') throw new TypeError('Middleware must be composed of functions!') } // 提供公开api用于调度中间件函数 return function (context, next) { // last called middleware # let index = -1 return dispatch(0) function dispatch (i) { if (i <= index) return Promise.reject(new Error('next() called multiple times')) // 改变变量index index = i // 取出当前中间件 let fn = middleware[i] if (i === middleware.length) fn = next if (!fn) return Promise.resolve() try { return Promise.resolve(fn(context, function next () { //触发下一中间件执行 return dispatch(i + 1) })) } catch (err) { return Promise.reject(err) } } }} // 创建上下文对象 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.app = request.app = response.app = this; context.req = request.req = response.req = req; context.res = request.res = response.res = res; request.ctx = response.ctx = context; request.response = response; response.request = request; context.onerror = context.onerror.bind(context); context.originalUrl = request.originalUrl = req.url; context.cookies = new Cookies(req, res, { keys: this.keys, secure: request.secure }); context.accept = request.accept = accepts(req); context.state = {}; return context; }
思维导图
0 0
- koa:当创建一个服务时,做了什么
- 当你达到了一个高度、你需要做什么?
- 当我们打开一个网页,浏览器做了什么?
- 当服务QPS增高时我们做什么
- 当你输入 nova boot时,client做了什么?
- 当一个程序员写不出代码了,需要做些什么呢?
- 当你在浏览器地址栏输入一个URL后回车,浏览器做了什么?
- 当一个.NET托管程序运行时都发生了什么,关闭时发生了什么
- 当我们点击了编译时,编译器都为我们做了什么
- 当我们老了,什么都来不及做了!
- 创建表对象时,oracle做了些什么?
- 创建对象时JVM为我们做了什么
- os运行一个程序时做了什么
- 面试问题:当我们在浏览器中输入一个域名url时,接下来会做什么
- 一个人人到底做了什么
- new 一个对象到底做了什么?
- 当我在做技术管理时,我在做什么?
- wxPython in Action (EVT_CLOSE)当关闭一个框架时都发生了什么?
- 设计模式-模版方法
- Spring+Shiro权限整合
- 动态规划
- Eclipse自动换行
- MVP代码示例
- koa:当创建一个服务时,做了什么
- dom4j 生成并解析xml文件
- 保持空杯,无惧未来-------sql raiserror() 强制返回 ;sql 调优 ---top 超时
- 看别人如何用MindManager思维导图教数学?
- 设计模式之装饰着模式
- Qt 文件操作
- 作业项目六
- c#媒体转发服务器HLS服务器实现1
- TLD目标跟踪算法学习(一)