2. Koa中间件与洋葱模型
时间:2019-10-19
本文章向大家介绍2. Koa中间件与洋葱模型,主要包括2. Koa中间件与洋葱模型使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1. async await
为了更好的理解aysnc、await, 我们先请求两个接口
1. 请求github中的用户接口
//请求github用户接口 fetch("//api.github.com/users") .then(res => res.json()) .then(json => console.log(json))
2. 请求github中的用户接口后, 请求特定用户接口
fetch("//api.github.com/users") .then(res => res.json()) .then(json => { console.log(json) fetch("//api.github.com/users/CQzhanghao") .then(res => res.json()) .then(json => console.log(json)) })
由此我们可以看出,代码的可读性不好,而我们这里仅仅是两层嵌套。那我们该怎么解决这个问题呢?
我们可以尝试使用下ES7的新语法 async、await, 号称是解决异步请求的最终方案
3. 用async、await重写上面两段请求方法
//请求github用户接口, 再请求特定用户 async () => { const res = await fetch("//api.github.com/users") const json = await res.json() console.log(json) const res2 = await fetch("//api.github.com/users/CQzhanghao") const json2 = await res.json() console.log(json2) }
对比一下, 可以明显看出用async、await写出的代码可读性非常高, 就像我们写同步请求一样。
2. 洋葱模型
洋葱模型是Koa中的一个重要概念, 我们通过一个例子来看看它是什么
const Koa = require('koa') const app = new Koa() //第一个中间件 app.use(async (ctx, next) => { console.log("第一个中间件 next执行前") await next() console.log("第一个中间件 next执行后") }) //第二个中间件 app.use(async (ctx, next) => { console.log('第二个中间件 next执行前') await next() console.log('第二个中间件 next执行后') }) //第三个中间件 app.use(async (ctx, next) => { console.log('第三个中间件 next执行前') await next() console.log('第三个中间件 next执行后') }) app.listen(3002)
一个中间件有两个参数, 第一个是ctx。ctx是由koa传入的封装了request和response的变量,我们可以通过它访问request和response.
另一个是next, next是指这个中间件下面的那个中间件,koa里面的所有功能都是通过中间件来完成的
在上面的代码中,我们可以使用用await next()执行下一个中间件
所以说, 我们应该能猜到上述代码的结果了:
可以看出, 这执行过程就像一个洋葱, 从外到里,再由里到外。
原文地址:https://www.cnblogs.com/zhanghaoblog/p/11704459.html
- Android之MaterialDesign应用技术
- 蛙啊!老母亲给你整理了DEDECMS漏洞集合,快回家!
- Android之Bmob移动后端云服务器
- golang基于redis lua封装的优先级去重队列
- Java设计模式总汇二(小白也要飞)
- Java设计模式总汇一
- Android数据绑定技术二,企业级开发
- Android数据绑定技术一,企业级开发
- 工具| sqlmap payload修改之路(下)
- Retrofit网络请求库应用02——json解析
- Servlet与Jsp的结合使用实现信息管理系统二
- Retrofit网络请求库应用01
- 有限状态机FSM的原理与GO的实现
- io.Reader 解析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 深入浅出SVM(PART III)
- 高频原题——LeetCode题目8:字符串转换整数 (atoi)
- 不转字符串判断——LeetCode题目9:回文数
- 关于双指针的简单理解
- 面试题噩梦之一——LeetCode题目10:正则表达式匹配
- 什么时候触发GC
- 找找数学上的规律——LeetCode题目11:盛最多水的容器
- Java学习笔记, 不断更新
- 这题真是送分——LeetCode题目12:整数转罗马数字
- 该了解一波了!零基础入门Nginx
- 轻松一刻——LeetCode题目13:罗马数字转整数
- 动动手——LeetCode题目14:最长公共前缀
- LeetCode题目15:三数之和
- 三数之和姊妹题——LeetCode题目16:最接近的三数之和
- 组合问题——LeetCode题目17:电话号码的字母组合