KOA 初探 洋葱模型
KOA 官网链接
当然,如果你有express的基础就最好了,毕竟是原班人马开发
常用的指令
npm install koa
npm install nodemon
touch app.js
nodemon app.js
测试一
use
use
函数 使用中间件
app.js
const Koa = require('koa')const app = new Koa()app.use((ctx,next)=>{console.log(1)console.log(2)
})
app.use((ctx,next)=>{console.log(3)console.log(4)
})app.listen(1019)
nodemon app.js
// 浏览器运行localhst:1019 输出
1
2
测试二
next()
next
函数主要负责将控制权交给下一个中间件,如果当前中间件没有终结请求,并且next没有被调用,那么当前中间件的请求将被挂起,等到next()后的中间件执行完再返回继续执行。总结来说,就是:从第一个中间件开始执行,遇到next进入下一个中间件,一直执行到最后一个中间件,在逆序,执行上一个中间件next之后的代码,一直到第一个中间件执行结束才发出响应。如下代码
const Koa = require('koa')const app = new Koa()app.use((ctx,next)=>{console.log(1)next()console.log(2)
})
app.use((ctx,next)=>{console.log(3)next() // 下一个中间件没有 按下执行 4console.log(4)
})app.listen(1019)
nodemon app.js
//输出
1
3
4
2
这可以说是一个最最最基本的洋葱模型,先进去再出来
测试三
const Koa = require('koa')const app = new Koa()app.use((ctx,next)=>{console.log(1)next() // 初次进入下个组件console.log(2)
})
app.use((ctx,next)=>{console.log(3)next() // 初次进入下个组件console.log(4)
})app.use((ctx,next)=>{console.log(5)next() // 初次进入下个组件console.log(6) // 没有下个组件 再组件向上
})app.listen(1019)
// 输出
1
3
5
6
4
2
测试四
const Koa = require('koa')const app = new Koa()app.use((ctx,next)=>{console.log(1)const a = next()console.log(a)console.log(2)
})
app.use((ctx,next)=>{console.log(3)console.log(4)
})app.listen(1019)
1
3
4
Promise { undefined } //因为上一个中间件没有返回值 ,如果return一个值,则有值 promise
2
如果对promise不太清楚的地方,可以点这里 Promise 和 Promise 与 异步机制
插一嘴,async 加在函数前,哪怕普通函数,也会强制转换成promise对象。控制台 输出打印后会有undefined,说明一个线程结束
测试五
const Koa = require('koa')const app = new Koa()app.use((ctx,next)=>{console.log(1)const a = next()console.log(a)console.log(2)
})
app.use((ctx,next)=>{console.log(3)console.log(4)return "中间件可以return"
})app.listen(1019)
1
3
4
Promise { '中间件可以return' }
2
案例六
async
用于申明一个function是异步的,而await
认为是async wait
的简写,等待一个异步方法的完成。
const Koa = require('koa')const app = new Koa()app.use( async(ctx,next)=>{console.log(1)const a = await next() // 或者不用按async await .then((res)=>{})console.log(a)console.log(2)
})
app.use((ctx,next)=>{console.log(3)console.log(4)return "中间件可以return"
})app.listen(1019)
1
3
4
中间件可以return
2
测试七
线程阻塞问题
测试七-1
const Koa = require('koa')const app = new Koa()app.use( async(ctx,next)=>{console.log(1)const a = await next()console.log(a)
})
app.use((ctx,next)=>{const axios = require('axios')const start = Date.now()const res = axios.get('http://www.baidu.com')const end = Date.now()console.log(end-start)
})app.listen(1019)
// 输出
1
1 // 这里返回 0或者1或者2 几乎可以忽略不计 不阻塞 可以认为没有等待上个axios.get()请求完成后再执行下一步
测试七-2
const Koa = require('koa')const app = new Koa()app.use( async(ctx,next)=>{console.log(1)const a = await next()console.log(a)
})
app.use(async(ctx,next)=>{const axios = require('axios')const start = Date.now()const res = await axios.get('http://www.baidu.com')const end = Date.now()console.log(end-start)
})app.listen(1019)
1
110 耗时较多 阻塞
测试七-3
const Koa = require('koa')const app = new Koa()app.use( async(ctx,next)=>{console.log(1)next()console.log(2)
})
app.use(async(ctx,next)=>{console.log(3)const axios = require('axios')const res = await axios.get('http://www.baidu.com') //线程阻塞返回上一个组件next()console.log(4)
})app.listen(1019)
// 返回没有按照洋葱模型执行
1
3
2
4
确保每个中间件按照洋葱模型执行
async()=>{await next()
}
测试七-4
const Koa = require('koa')const app = new Koa()app.use( async(ctx,next)=>{console.log(1)await next()console.log(2)
})
app.use(async(ctx,next)=>{console.log(3)const axios = require('axios')const res = await axios.get('http://www.baidu.com')next()console.log(4)
})app.listen(1019)
// 返回按照洋葱模型执行
1
3
4
2
测试八
自己写的中间件,return 传递数组,是没有问题的。但是如果使用第三方插件,就不太方便了。所以koa使用了一个全局上下文对象ctx。类似于window,一个全局对象,你就会window.xx。
const Koa = require('koa')const app = new Koa()app.use( async(ctx,next)=>{console.log(1)await next()console.log(ctx.htmlData)
})
app.use(async(ctx,next)=>{console.log(3)const axios = require('axios')const res = await axios.get('http://www.baidu.com')ctx.htmlData = resnext()console.log(4)
})app.listen(1019)
// 百度的信息'<!DOCTYPE html>\n<!--STATUS OK--><html>\n<head>\n \n <meta http-equiv="content-type" content="text/html;charset=utf-8">\n <meta http-equiv="X-UA-Compatible" content="IE=Edge">\n\t<meta content="always" name="referrer">\n <meta name="theme-color" content="#2932e1">\n <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" />\n <link rel="search" type="application/opensearchdescription+xml" href="/content-search.xml" title="百度搜索" />\n <link rel="icon" sizes="any" mask href="//www.baidu.com/img/baidu_85beaf5496f291521eb75ba38eacbd87.svg">\n\t\n\t\n\t<link rel="dns-prefetch" href="//s1.bdstatic.com"/>\n\t<link rel="dns-prefetch" href="//t1.baidu.com"/>\n\t<link rel="dns-prefetch" href="//t2.baidu.com"/>\n\t<link rel="dns-prefetch" href="//t3.baidu.com"/>\n\t<link rel="dns-prefetch" href="//t10.baidu.com"/>\n\t<link rel="dns-prefetch" href="//t11.baidu.com"/>\n\t<link rel="dns-prefetch" href="//t12.baidu.com"/>\n\t<link rel="dns-prefetch" href="//b1.bdstatic.com"/>\n \n <title>百度一下,你就知道</title>\n \n\n<style id="css_index" index="index" type="text/css">html,body{height:100%}\nhtml{overflow-y:auto}\nbody{font:12px arial;text-align:;background:#fff}\nbody,p,form,ul,li{margin:0;padding:0;list-style:none}\nbody,form,#fm{position:relative}\ntd{text-align:left}\nimg{border:0}\na{color:#00c}\na:active{color:
初探就这样了,喜欢的点个赞。如果有疑问出入,欢迎交流。
KOA 初探 洋葱模型相关推荐
- Koa的洋葱模型到底是什么?
什么是Koa? Koa是一个精简的node框架,被认为是第二代Node框架,其最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型,它的核心工作包括下面两个方面: 将node原生的req和res封 ...
- KOA --- 2. 洋葱模型
一.什么是koa的洋葱模型 特点: 独特的中间件流程控制,就是典型的洋葱模型 二.解析洋葱模型 在两个中间件函数,用 next 隔开 对应的代码Demo const Koa = require('ko ...
- koa 中间件洋葱模型源码分析
中间件基本使用 app.use(async(ctx,next)=>{ctx.state={username:'jeff'};await next();... })app.use(async(ct ...
- 聊一聊KOA的洋葱模型
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 async 函数,Koa ...
- 说说你对koa中洋葱模型的理解?
用过Koa的,肯定对 Middleware(中间件) 有所了解,那我们就用中间件从现象出发,理解洋葱模型 先自定义两个中间件: logTime:打印时间戳 module.exports=functio ...
- Koa核心—洋葱模型
洋葱模型 koa框架的业务流程是一个完全的异步编程模型,通过ctx上下文对象来贯穿http的上下游.那么我们最重要的就是理解洋葱模型. const koa = require("Koa&qu ...
- 洋葱模型php,聊一聊KOA的洋葱模型
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 async 函数,Koa ...
- koa - 洋葱模型浅析
1.什么是koa? Koa是一个精简的node框架,被认为是第二代Node框架,其最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型,它的核心工作包括下面两个方面: 将node原生的req和re ...
- 你需要掌握的 Koa 洋葱模型和中间件
大家好,我是前端西瓜哥. Koa 是一个 nodejs 框架,经常用于写 web 后端服务.它是 Express 框架的原班人马开发的新一代 web 框架,使用了 async / await 来优雅处 ...
最新文章
- python读文件路径-在Python中按路径读取数据文件的几种方式
- 微服务java模块内存管理_Java 9模块服务
- Linux内核哈希表分析与应用
- linux安半程序自动确认,利用system-config-kickstart实现半自动化安装
- 正版卡巴斯基安全部队2011激活码1年
- XINS 3.0 正式版发布,远程 API 调用规范
- WPF 框架prism代码笔记
- MATLAB与Hspice联合仿真
- [人脸关键点检测] Wing loss 论文解读
- 认知升级之第一性原理
- Quality Assurance (质量保证)
- 为什么单片机定时器的TH和TL都要设置?
- 软件技术人员成长路线的设计
- 用Websocket聊天完整demo,做笔记用,各位大佬多多指教
- ajax请求是宏任务还是微任务_好程序员web前端学习路线分享了解AJAX是什么
- 关于启发式算法、元启发式算法以及超启发式算法的理解
- 欺骗的艺术——第二部分(11)
- 【MindMapper2008】选中文字自动生成节点
- js笔记十:vscode代码提示(20211221补充)
- c语言调用json编程,c语言开发JSON - wangxuwei的个人空间 - OSCHINA - 中文开源技术交流社区...