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 初探 洋葱模型相关推荐

  1. Koa的洋葱模型到底是什么?

    什么是Koa? Koa是一个精简的node框架,被认为是第二代Node框架,其最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型,它的核心工作包括下面两个方面: 将node原生的req和res封 ...

  2. KOA --- 2. 洋葱模型

    一.什么是koa的洋葱模型 特点: 独特的中间件流程控制,就是典型的洋葱模型 二.解析洋葱模型 在两个中间件函数,用 next 隔开 对应的代码Demo const Koa = require('ko ...

  3. koa 中间件洋葱模型源码分析

    中间件基本使用 app.use(async(ctx,next)=>{ctx.state={username:'jeff'};await next();... })app.use(async(ct ...

  4. 聊一聊KOA的洋葱模型

    Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 async 函数,Koa ...

  5. 说说你对koa中洋葱模型的理解?

    用过Koa的,肯定对 Middleware(中间件) 有所了解,那我们就用中间件从现象出发,理解洋葱模型 先自定义两个中间件: logTime:打印时间戳 module.exports=functio ...

  6. Koa核心—洋葱模型

    洋葱模型 koa框架的业务流程是一个完全的异步编程模型,通过ctx上下文对象来贯穿http的上下游.那么我们最重要的就是理解洋葱模型. const koa = require("Koa&qu ...

  7. 洋葱模型php,聊一聊KOA的洋葱模型

    Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小.更富有表现力.更健壮的基石. 通过利用 async 函数,Koa ...

  8. koa - 洋葱模型浅析

    1.什么是koa? Koa是一个精简的node框架,被认为是第二代Node框架,其最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型,它的核心工作包括下面两个方面: 将node原生的req和re ...

  9. 你需要掌握的 Koa 洋葱模型和中间件

    大家好,我是前端西瓜哥. Koa 是一个 nodejs 框架,经常用于写 web 后端服务.它是 Express 框架的原班人马开发的新一代 web 框架,使用了 async / await 来优雅处 ...

最新文章

  1. python读文件路径-在Python中按路径读取数据文件的几种方式
  2. 微服务java模块内存管理_Java 9模块服务
  3. Linux内核哈希表分析与应用
  4. linux安半程序自动确认,利用system-config-kickstart实现半自动化安装
  5. 正版卡巴斯基安全部队2011激活码1年
  6. XINS 3.0 正式版发布,远程 API 调用规范
  7. WPF 框架prism代码笔记
  8. MATLAB与Hspice联合仿真
  9. [人脸关键点检测] Wing loss 论文解读
  10. 认知升级之第一性原理
  11. Quality Assurance (质量保证)
  12. 为什么单片机定时器的TH和TL都要设置?
  13. 软件技术人员成长路线的设计
  14. 用Websocket聊天完整demo,做笔记用,各位大佬多多指教
  15. ajax请求是宏任务还是微任务_好程序员web前端学习路线分享了解AJAX是什么
  16. 关于启发式算法、元启发式算法以及超启发式算法的理解
  17. 欺骗的艺术——第二部分(11)
  18. 【MindMapper2008】选中文字自动生成节点
  19. js笔记十:vscode代码提示(20211221补充)
  20. c语言调用json编程,c语言开发JSON - wangxuwei的个人空间 - OSCHINA - 中文开源技术交流社区...

热门文章

  1. 【核心内容及推导思路】人类记忆系统之谜,也许就是这么回事儿
  2. 可视化编程和低代码编程
  3. MATLAB TXT转Excel
  4. SQL Loader使用方法
  5. 微信小程序开发Day6——定时器的应用
  6. 绿色出行,从智慧公厕开始!
  7. 5509A 常用函数
  8. Java 中的 switch 语句
  9. 使用SQLite更改表的内容不成功
  10. ​​你会项目管理吗?