什么是 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. 从零开始学习PYTHON3讲义(六)for循环跟斐波那契数列

    <从零开始PYTHON3>第六讲 几乎但凡接触过一点编程的人都知道for循环,在大多数语言的学习中,这也是第一个要学习的循环模式. 但是在Python中,我们把for循环放到了while循 ...

  2. WebSocket刨根问底(二)

    上篇文章[WebSocket刨根问底(一)]中我们对WebSocket的一些基本理论进行了介绍,但是并没有过多的涉及到一些实战的内容,今天我希望能够用几个简单的案例来向小伙伴们展示下WebSocket ...

  3. python:pip命令使用

    pip命令安装库  pip install 库名 使用pip命令更新库 pip install --upgrade 库名 比如更新scikit-learn包 pip install --upgrade ...

  4. 线程安全(中)--彻底搞懂synchronized(从偏向锁到重量级锁)

    接触过线程安全的同学想必都使用过synchronized这个关键字,在java同步代码快中,synchronized的使用方式无非有两个: 通过对一个对象进行加锁来实现同步,如下面代码. synchr ...

  5. [MXNet逐梦之旅]练习一·使用MXNet拟合直线手动实现

    [MXNet逐梦之旅]练习一·使用MXNet拟合直线手动实现 code #%% from matplotlib import pyplot as plt from mxnet import autog ...

  6. .Net Core SDK 命令介绍

    前言 本篇主要介绍 asp.net core 中,使用 dotnet tools 运行 dotnet run 之后的系统执行过程. 如果你觉得对你有帮助的话,不妨点个[推荐]. 目录 dotnet r ...

  7. kubernetes系列05—kubectl应用快速入门

    本文收录在容器技术学习系列文章总目录 1.使用kubectl 1.1 介绍 kubectl用于运行Kubernetes集群命令的管理工具. 1.2 语法 kubectl [command] [TYPE ...

  8. Java Socket通信实现私聊、群聊

    前言 闲言少叙,上代码! 代码编写 server服务端 /** * 服务端 */ public class Server { private static ServerSocket server = ...

  9. iOS 循环引用讲解(中)

    谈到循环引用,可能是delegate为啥非得用weak修饰,可能是block为啥要被特殊对待,你也可能仅仅想到了一个weakSelf,因为它能解决99%的关于循环引用的事情.下面我以个人的理解谈谈循环 ...

  10. 第7章 贡献 - Identity Server 4 中文文档(v1.0.0)

    我们对社区贡献非常开放,但您应该遵循一些指导原则,以便我们可以毫不费力地处理这个问题. 7.1 如何贡献? 最简单的方法是打开一个问题并开始讨论.然后我们可以决定是否以及如何实现功能或更改.如果您应提 ...