什么是 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. Leetcode - 剑指offer 面试题29:数组中出现次数超过一半的数字及其变形(腾讯2015秋招 编程题4)

    剑指offer 面试题29:数组中出现次数超过一半的数字 提交网址: http://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163 ...

  2. 图像识别基本算法之SURF

    图像识别.人脸识别可行的算法有很多.但是作为学习,如果能理清这个问题研究的历程及其主线,会对你深入理解当前研究最新的发展有很多帮助.本文是自己在学习过程中的笔记,大多内容来自于网络,出处请参考最后的引 ...

  3. 从锅炉工到AI专家(1)

    序言 标题来自一个很著名的梗,起因是知乎上一个问题:<锅炉设计转行 AI,可行吗?>,后来就延展出了很多类似的问句,什么"快递转行AI可行吗?"."xxx转行 ...

  4. Android Nine-patch(.9.png)小结

    最近在项目开发过程中,因为界面布局美化的需要开始接触到.9.png,无论是Goolge官方文档还是网上其他资料, 都给出了很多关于.9.png的基本介绍,.9.png基础文章推荐以下几篇: Googl ...

  5. Web工作方式:浏览网页的时候发生了什么?

    原文地址:https://wizardforcel.gitbooks.io/build-web-application-with-golang/content/03.1.html 我们平时浏览网页的时 ...

  6. JQuery实现数组移除指定元素

    公式: 数组.splice($.inArray(元素,数组),数量); 实例: var arr = ['a','b','c','d']; arr.splice($.inArray('c',arr),1 ...

  7. 冒泡排序/选择排序/插入排序(c#)

    ---恢复内容开始--- 每次看这些排序都像没见过一样,完全理解不了,可是不久前明明了解的十分透彻.记下来记下来记下来! 1>>>冒泡排序:相邻的两两相比 把大的(或者小的)放后边, ...

  8. [Go] golang缓冲通道实现资源池

    go的pool资源池:1.当有多个并发请求的时候,比如需要查询数据库2.先创建一个2个容量的数据库连接资源池3.当一个请求过来的时候,去资源池里请求连接资源,肯定是空的就创建一个连接,执行查询,结束后 ...

  9. 配置多个git账号的ssh密钥

    博客改版,请直接访问新版文章:https://www.cnblogs.com/xiaoxi666/p/9975981.html 背景 我们在工作中会以 ssh 的方式配置公司的 git 账号,但是平时 ...

  10. 看Android Stuido教程有感

    毕业两年了,之前一直都在另外的博客里写之前大学的经历,以及转载一些学习Android的点滴,原创的并不多.因为现在更多的是在博客园里逛,所以直到上个月还是鼓起勇气开通了博客,算来到今天也有一段时间了, ...