全栈项目|小书架|服务器开发-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实现首页图书列表接口
通过上篇文章 全栈项目|小书架|微信小程序-首页水平轮播实现 我们实现了前端(小程序)效果图的展示,这篇文章来介绍服务器端的实现. 首页书籍信息 先来回顾一下首页书籍都有哪些信息: 从下面的图片可以看 ...
随机推荐
- nginx之别名、location使用
alias server { listen 80; server_name www.xxxpc.net ~^www\.site\d+\.net$; error_page 500 502 503 504 ...
- 设置win 10 软件开机启动
C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 将快捷方式粘贴进去即可
- node省市区三级数据性能测评
闲来无事,测试下node和egg 首先是数据库,大概长这样 然后是代码 'use strict'; const Controller = require('egg').Controller; clas ...
- pdf 翻译
某某狗 https://www.fanyigou.com/tslg/share/4DO875ON.htm
- Redis的常用JavaAPI(Jedis)实现
一. pom依赖: <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency> & ...
- Mysql中的Date转换
一.背景 Mysql中有张表,表的一列为Date类型. 1. 插入日期xxx.setCreateTime(new Date())mybatis.insert(xxx) 2. 读取日期用Mybaitis ...
- leetcode 10. Regular Expression Matching 、44. Wildcard Matching
10. Regular Expression Matching https://www.cnblogs.com/grandyang/p/4461713.html class Solution { pu ...
- 【449】Win10 蓝牙耳机链接没有声音
Exhausting,当电脑出现问题的时候!!! 问题描述:蓝牙耳机连接上了电脑,但是通过右下角声音按钮无法选择蓝牙耳机的选项??? 解决方案:在声音按钮处点击右键,选择最下面的菜单“troubles ...
- 【449】backup get weekly tweets
import pandas as pd from datetime import datetime fn = r"D:\OneDrive - UNSW\tweets_flu.csv" ...
- Sql server 中将数据行转列列转行(二)
老规矩,先弄一波测试数据,数据填充代码没有什么意义,先折叠起来: /* 第一步:创建临时表结构 */ CREATE TABLE #Student --创建临时表 ( StuName ), --学生名称 ...
