全栈项目|小书架|服务器开发-Koa2中间件机制洋葱模型了解一下
KOA2
是什么?
Koa是一个新的
web框架,由 Express 幕后的原班人马打造, 致力于成为web应用和API开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用async函数,Koa帮你丢弃回调函数,并有力地增强错误处理。Koa并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。
为什么产生?
笔者对这几个框架都不熟,这里就不误人子弟了。可以看看下面一些大佬的介绍。
Koa是由Express的原班人马打造,那么他们为什么不将Express升级版本呢而是从新开发新的一个项目?看官方的介绍:Koa 与 Express
中间件
中间件(英语:
Middleware),又译中间件、中介层,是提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通,特别是应用软件对于系统软件的集中的逻辑,在现代信息技术应用框架如Web服务、面向服务的体系结构等中应用比较广泛。中间件-维基百科
中间件只是一种服务,没有这种服务系统也能够存在。比如:一台台式机,是由很多个部件组装而成。鼠标、键盘等只是为了让系统更加完善。即使没有鼠标或者键盘,台式机也可以使用其他硬件软件来操作电脑。或者查看 AOP 面向切面编程 中的比喻。
Koa 是一个中间件框架,可以采用两种不同的方法来实现中间件:
async functioncommon function
以下是使用两种不同方法实现一个日志中间件的示例:
中间件通常带有两个参数
(ctx, next), ctx是一个请求的上下文(context),
next是调用执行下游中间件的函数. 在代码执行完成后通过then方法返回一个Promise。关于Promise介绍可以查看这篇文章: Promise原理讲解 && 实现一个Promise对象 (遵循Promise/A+规范)
async functions (node v7.6+)
app.use(async (ctx, next) => {
const start = Date.now();
await next();
const ms = Date.now() - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});
Common function
app.use((ctx, next) => {
const start = Date.now();
return next().then(() => {
const ms = Date.now() - start;
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`);
});
});
Koa 的中间件机制使用的是洋葱模型,而什么是洋葱模型呢?
洋葱模型
通过
next()把多个中间件串联执行的效果。所有的中间件都会执行两边,就像洋葱一样,从洋葱的一侧进入就会从另一侧出去。
洋葱圈模型图示1来源
就是从请求到响应的过程所有的中间件都会走两遍。看不太清楚的可以看图示2。
洋葱圈模型图示2 来源
通过图示可能还不是很清楚Koa洋葱模型的执行过程,下面来看一个简单例子:
const Koa = require('koa');
const app = new Koa();
// 中间件1
app.use(async (ctx, next)=>{
console.log(1)
next()
console.log(11)
});
// 中间件2
app.use(async (ctx, next) => {
console.log(2)
next()
console.log(22)
})
// 中间件3
app.use(async (ctx, next) => {
console.log(3)
next()
console.log(33)
})
app.listen('3000');
console.log(`http://localhost:3000`);
在浏览器输入http://localhost:3000回车之后的输出结果:
http://localhost:3000
1
2
3
33
22
11
通过结果可以看出执行过程和洋葱模型是一致的。
参考
咨询请加微信:轻撩即可。
全栈项目|小书架|服务器开发-Koa2中间件机制洋葱模型了解一下的更多相关文章
- 全栈项目|小书架|服务器开发-Koa2 全局异常处理
什么是异常 做开发的基本都知道异常,像Android开发中常见的ANR异常.空指针异常,服务器开发中经常遇到的异常404,500异常,还有一些其他常见的异常,具体可见HTTP状态码. 基本上这些异常可 ...
- 全栈项目|小书架|服务器开发-Koa2 连接MySQL数据库(Navicat+XAMPP)
为什么使用数据库 为什么需要数据库?-知乎 相比与文件系统,数据库具有以下优势: 高效率:查找效率高 高可用:可数据库共享 安全性强:数据不能随意修改 选择哪个数据库 数据库可以分为关系型数据库和非关 ...
- 全栈项目|小书架|服务器开发-Koa2 参数校验处理
为什么需要做参数校验 在开发中,无论是App开发还是服务器接口开发, 我们无法去预测用户传入的数据,因此参数(数据)校验是开发中不可或缺的一环. 例如像App的注册登录表单提交页面,就要做好多层的判断 ...
- 全栈项目|小书架|服务器开发-NodeJS 使用 JWT 实现登录认证
通过这篇 全栈项目|小书架|服务器开发-JWT 详解 文章我们对JWT有了深入的了解,那么接下来介绍JWT如何在项目中使用. 安装 $ npm install jsonwebtoken 生成 Toke ...
- 全栈项目|小书架|服务器开发-NodeJS 项目分包
唠嗑 参考的是慕课网七月老师的课程,七月的课质量真的挺高的,推荐一波.这次的小书架项目源码不会全部公开,因为用了七月老师课程的绝大部分代码.虽然代码不全,但是只要思路看得懂,代码实现就很简单了. 小书 ...
- 全栈项目|小书架|服务器开发-JWT 详解
JWT 官方简介:Introduction to JSON Web Tokens 文章基本是官网内容的翻译,英文不错的同学可点击上面的链接直接看英文文档. 什么是 JWT JWT全称是JSON Web ...
- 全栈项目|小书架|服务器开发-NodeJS 中使用 Sequelize 操作 MySQL数据库
安装 官网:https://sequelize.org/v5/manual/getting-started.html 安装sequelize及数据库连接驱动 npm install --save se ...
- 全栈项目|小书架|服务器开发-Koa全局路由实现
什么是路由 路由就是具体的访问路径,指向特定的功能模块.一个api接口是由ip(域名)+端口号+路径组成,例如 :https://www.npmjs.com/package/koa-router就是一 ...
- 全栈项目|小书架|服务器端-NodeJS+Koa2实现首页图书列表接口
通过上篇文章 全栈项目|小书架|微信小程序-首页水平轮播实现 我们实现了前端(小程序)效果图的展示,这篇文章来介绍服务器端的实现. 首页书籍信息 先来回顾一下首页书籍都有哪些信息: 从下面的图片可以看 ...
随机推荐
- JavaScript中字符串多行编辑
常用写法: var str = 'w3c' +'标准' +'方式.' 升级版:var str = ['w3c','标准','方式.'].join('');终极版:var str = 'w3c\标准\方 ...
- HDU-5215 Cycle(边双/判奇偶环)
题目 HDU-5215 Cycle 网上那个啥dfs的垃圾做法随便弄组数据已经hack掉了 做法 纯奇环偶环通过dfs树上,染色判断(由于偶环可能有两个奇环,通过一点相交,dfs树上并不能判完) 两环 ...
- node省市区三级数据性能测评
闲来无事,测试下node和egg 首先是数据库,大概长这样 然后是代码 'use strict'; const Controller = require('egg').Controller; clas ...
- PokemonGo-LBS AR项目实战
<Pokemon GO>在2016年发布,立即成为一款现象级手游,时至今日也是最成功的AR游戏!<Pokemon GO>目前仍旧吸引全球范围内大批玩家入驻,而这也使得该款游戏创 ...
- Linux下查看目录文件数和文件大小
一.查看当前目录下文件个数 在linux下查看目录下有多少文件可以用:ls -l 命令查看,ls -lR 递归查看所有目录, 如果文件很多,则用wc命令 和 grep 命令进行过滤. wc命令显示输 ...
- 浏览器渲染基本原理(二):JS引擎的工作方式
JS引擎也可以叫做JS解释器 浏览器的组成 浏览器的核心是两部分:渲染引擎和JavaScript解释器(又称JavaScript引擎). (1)渲染引擎 渲染引擎的主要作用是,将网页从代码“渲染”为用 ...
- dubbo架构角色
角色 Dubbo有5个参与者:其中Monitor.Registry不是必须的 Provider 暴露服务的服务提供方 Consumer 调用远程服务的服务消费方(负载均衡) Registry 服务注册 ...
- IDEA2019.2.1中文乱码解决
写在前面 太晚了, 长话短说, idea更新到2019.2.1, 项目任何地方输入中文都是乱码, 修改编码UTF-8依然如此.参考https://blog.csdn.net/chenjk10/arti ...
- kafka发送超大消息设置
最近开发一cdc框架,为了测试极端情况,需要kafka传递100万条数据过去,1个G左右,由于其他环节限制,不便进行拆包(注:测下来,大包走kafka不一定性能更好,甚至可能更低). 测试百万以上的变 ...
- asp.net core mvc 读取配置文件appsettings.json
上一篇我们将了读取自定义配置文件.这篇我们讲一下asp.net core mvc里读取自带的配置文件 appsettings.json 首先创建个asp.net core mvc项目,项目里有Prog ...
