什么是 Koa 的中间件

通俗的讲:中间件就是匹配路由之前或者匹配路由完成做的一系列的操作,我们就可以 把它叫做中间件。

在express中间件(Middleware)是一个函数,它可以访问请求对象(requestobject(req)) , 响应对象(responseobject(res)), 和 web 应用中处理请求-响应循环流程中的中间件,一 般被命名为 next 的变量。

在 Koa 中中间件和 express 有点类似。

中间件的功能包括:执行任何代码。 修改请求和响应对象。 终结请求-响应循环。 调用堆栈中的下一个中间件

如果我的 get、post 回调函数中,没有 next 参数,那么就匹配上第一个路由,就不会往下匹 配了。如果想往下匹配的话,那么需要写 next()

Koa 应用可使用的几种中间件

应用级中间件 ,路由级中间件 ,错误处理中间件 ,第三方中间件

应用级中间件

比如下面在匹配任何路由之前都需要先验证一些用户是否有权限访问这个页面,这里demo只是打印一下当前时间

const koa = require('koa')
const router = require('koa-router')() // 引入和实例化路由 const app = new koa() // 创建koa实列 app.use(async (ctx, next) => {
console.log(new Date()) // 运行后在匹配任何一个路由之前都会先执行一下这个中间件,不管这个路由存不存在
await next() // 当前路由匹配完成后继续向下匹配
}) // 配置路由
router.get('/', async (ctx, next) => {
ctx.body="Hello koa";
}) router.get('/news', async (ctx, next) => {
ctx.body='这是新闻页面'
});
app.use(router.routes())
app.use(router.allowedMethods()); app.listen(3000,()=>{
console.log('starting at port 3000');
})

路由中间件

const koa = require('koa')
const router = require('koa-router')() // 引入和实例化路由 const app = new koa() // 创建koa实列 // 配置路由
router.get('/', async (ctx, next) => {
ctx.body="Hello koa";
}) // 匹配到news路由以后继续往下匹配路由
router.get('/news', async (ctx, next) => {
console.log('这是新闻页面');
await next() // 如果没有这个next那么访问路由/news会找不到这个路由
});
router.get('/news', async (ctx) => {
console.log(ctx.params);
ctx.body='这是新闻页面'
});
app.use(router.routes())
app.use(router.allowedMethods()); app.listen(3000,()=>{
console.log('starting at port 3000');
})

错误处理中间件

const koa = require('koa')
const router = require('koa-router')() // 引入和实例化路由 const app = new koa() // 创建koa实列 app.use(async (ctx, next)=> {
console.log('这是一个中间件')
next();
console.log(ctx.status)
if(ctx.status==404){
ctx.status = 404;
ctx.body="这是一个 404 页面"
}
}) // 配置路由
router.get('/', async (ctx, next) => {
ctx.body="Hello koa";
}) router.get('/news', async (ctx) => {
console.log('这是新闻页面')
ctx.body='这是新闻页面'
}); app.use(router.routes())
app.use(router.allowedMethods()); app.listen(3000,()=>{
console.log('starting at port 3000');
})

Koa 中间件的执行顺序

Koa 的中间件和 Express 不同,Koa 选择了洋葱圈模型。

当服务端接收到请求后,先执行app.use中间件中next()上面的代码,next()后会去匹配路由,如果匹配到,执行匹配到的那个路由里面的代码,然后在执行中间件中next()下面的代码

const koa = require('koa')
const router = require('koa-router')() // 引入和实例化路由 const app = new koa() // 创建koa实列 //匹配任何路由 ,如果不写next,这个路由被匹配到了就不会继续向下匹配
app.use(async (ctx,next)=>{
console.log('1、这是第一个中间件01')
await next();
console.log('5、匹配路由完成以后又会返回来执行中间件')
}) app.use(async (ctx,next)=>{
console.log('2、这是第二个中间件02')
await next();
console.log('4、匹配路由完成以后又会返回来执行中间件')
}) // 配置路由
router.get('/', async (ctx, next) => {
ctx.body="Hello koa";
}) router.get('/news', async (ctx) => {
console.log('3、匹配到了news这个路由')
ctx.body='这是新闻页面'
}); app.use(router.routes())
app.use(router.allowedMethods()) app.listen(3000,()=>{
console.log('starting at port 3000')
})

执行结果

koa 中间件的更多相关文章

  1. koa中间件系统原理及koa+orm2实践。

    koa是由 Express 原班人马打造的新的web框架.套用其官方的说法:Koa 应用是一个包含一系列中间件 generator 函数的对象. 这些中间件函数基于 request 请求以一个类似于栈 ...

  2. KOA中间件的基本运作原理

    示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 华为云社区地址:[你要的前端打怪升级指南] 在中 ...

  3. 【nodejs原理&源码赏析(2)】KOA中间件的基本运作原理

    [摘要] KOA中间件的基本运作原理 示例代码托管在:http://www.github.com/dashnowords/blogs 在中间件系统的实现上,KOA中间件通过async/await来在不 ...

  4. Koa - 中间件(理解中间件、实现一个验证token中间件)

    前言 Koa 应用程序是一个包含一组中间件函数的对象,它是按照类似堆栈的方式组织和执行的. 当一个中间件调用 next() 则该函数暂停并将控制传递给定义的下一个中间件.当在下游没有更多的中间件执行后 ...

  5. Koa中间件(middleware)级联原理

    前言 上次看到了koa-compose的代码,今天来说一下koa中间件的级联以及工作原理. 中间件工作原理 初始化koa实例后,我们会用use方法来加载中间件(middleware),会有一个数组来存 ...

  6. Koa 中间件的执行

    Node.js 中请求的处理 讨论 Koa 中间件前,先看原生 Node.js 中是如何创建 server 和处理请求的. node_server.js const http = require(&q ...

  7. koa 基础(八)koa 中间件的执行顺序

    1.koa 中间件的执行顺序 app.js /** * koa 中间件的执行顺序 */ // 引入模块 const Koa = require('koa'); const router = requi ...

  8. Koa与Node.js开发实战(2)——使用Koa中间件获取响应时间(视频演示)

    学习架构: 在实战项目中,经常需要记录下服务器的响应时间,也就是从服务器接收到HTTP请求,到最终返回给客户端之间所耗时长.在Koa应用中,利用中间件机制可以很方便的实现这一功能.代码如下所示: 01 ...

  9. koa中间件机制详解

    转自:https://cnodejs.org/topic/58fd8ec7523b9d0956dad945 koa是由express原班人马打造的一个更小.更富有表现力.更健壮的web框架. 在我眼中 ...

随机推荐

  1. 带着新人学springboot的应用11(springboot+Dubbo+Zookeeper 上)

    这次说个在大型项目比较常见的东西,就是分布式,分布式到底是个什么东西呢?概念太大,不好说,就像刚学javaee的人问你,什么是web啊,什么是spring啊等等,你可能觉得,这个东西我好像知道,但是用 ...

  2. JVM(四)垃圾回收的实现算法和执行细节

    全文共 1890 个字,读完大约需要 6 分钟. 上一篇我们讲了垃圾标记的一些实现细节和经典算法,而本文将系统的讲解一下垃圾回收的经典算法,和Hotspot虚拟机执行垃圾回收的一些实现细节,比如安全点 ...

  3. Spring Boot 2.x (十):构建优雅的RESTful接口

    RESTful 相信在座的各位对于RESTful都是略有耳闻,那么RESTful到底是什么呢? REST(Representational State Transfer)表述性状态转移是一组架构约束条 ...

  4. 语音识别(LSTM+CTC)

    完整版请微信关注“大数据技术宅” 序言:语音识别作为人工智能领域重要研究方向,近几年发展迅猛,其中RNN的贡献尤为突出.RNN设计的目的就是让神经网络可以处理序列化的数据.本文笔者将陪同小伙伴们一块儿 ...

  5. Markdown 语法详尽笔记大全 2019

    目录  0.介绍  1.快捷键  2.基本语法  2.1 分级标题 # 写法1 # 写法2 上下文标题  2.2 字体设置斜体.粗体.删除线 _*~  2.3 分割线 --- 或 ***  2.4 引 ...

  6. 第13章 切换到混合流并添加API访问 - Identity Server 4 中文文档(v1.0.0)

    在之前的快速入门中,我们探讨了API访问和用户身份验证.现在我们想把这两个部分放在一起. OpenID Connect和OAuth 2.0组合的优点在于,您可以使用单个协议和使用令牌服务进行单次交换来 ...

  7. C# 判断网卡类型以及其他网卡信息

    NetworkInterface[] interfaces = NetworkInterface.GetAllNetworkInterfaces(); foreach (NetworkInterfac ...

  8. [笔记]原生JS实现的DOM操作笔记

    原生JS实现的DOM一系列操作参考: 原生JavaScript封装DOM库 siblings: 原生JS-查找相邻的元素-siblings方法的实现 addClass,removeClass,hasC ...

  9. 深海中的STL—mt19937

    mt19937 当你第一眼看到这玩意儿的时候 肯定禁不住吐槽:纳尼?这是什么鬼? 确实,这个东西鲜为人知,但是它却有着卓越的性能 简介 mt19937是c++11中加入的新特性 它是一种随机数算法,用 ...

  10. npm 安装及使用

    1. 安装 npm 安装完node后,就自动完成npm的安装. 2. 常用的npm命令 #安装包 npm install <pkg> 或者 npm install <pkg>@ ...