什么是 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. 补习系列(10)-springboot 之配置读取

    目录 简介 一.配置样例 二.如何注入配置 1. 缺省配置文件 2. 使用注解 3. 启动参数 还有.. 三.如何读取配置 @Value 注解 Environment 接口 @Configuratio ...

  2. sql distinct详解以及优化

    一.distinct简介 distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用 它来返回不重复记录的条数,而不是用它来返回不重记录的所有值.其原因是distinct只有用二重循环查询 ...

  3. HDFS架构及原理

    原文链接:HDFS架构及原理 引言 进入大数据时代,数据集的大小已经超过一台独立物理计算机的存储能力,我们需要对数据进行分区(partition)并存储到若干台单独的计算机上,也就出现了管理网络中跨多 ...

  4. spark问题

    使用IDEA运行spark程序,除了需要导入spark的一些依赖包之外,还需要注意的是 当启动spark报找不到可执行的hadoop winutils.exe 可已下载相应版本的winutils.ex ...

  5. Linux-Kconfig总结与分析

    使用Kconfig时,需要注意的地方 1.在Kconfig中定义的配置宏,前缀都没有"CONFIG_",只有编译内核时,自动生成autoconf.h才会出现前缀. 2.如果XX_d ...

  6. Java开发笔记(三十三)字符包装类型

    正如整型int有对应的包装整型Integer那样,字符型char也有对应的包装字符型Character.初始化字符包装变量也有三种方式,分别是:直接用等号赋值.调用包装类型的valueOf方法.使用关 ...

  7. JS数组Sort方法的使用

    想用sort方法对数组排下序,代码如下: var nums = "12 645 6 85 81 0 9 365 4 752".split(" ").map(fu ...

  8. java 线程方法 ---- yiled()

    class MyThread3 implements Runnable{ @Override public void run() { for (int i = 0; i < 3; i++){ / ...

  9. Android为TV端助力 MediaPlayer 错误代码(error code)总结 转载

    public static final int MEDIA_ERROR_IO Added in API level 17 File or network related operation error ...

  10. Android为TV端助力 播放视频卡顿问题

    问题分析: 1.连接服务器,ping IP 看看有没有丢包 2.写一个只有mediaplayer的Demo,放到同款的盒子或者电视,保证网咯也是一样的情况下,看看Demo卡不卡 如果一直不卡,那有可能 ...