Koa2 middleware插件执行顺序

大家好,我是李俊辉!如果您觉得文章有用,请帮忙点个赞或关注,也为我鼓励一下,坚持写下去!

koaExpress的下一代基于Node.js的web框架,目前是2.11.0版本。
基于ES7 koa2完全使用Promise并配合async来实现异步插件。
下面是一个koa2建立服务器server基础代码:
首先建立一个app.js,输入如下代码:

// 我们导入的是一个class,因此用大写的Koa表示:
const Koa = require('koa');

// 创建一个Koa对象表示web app本身:
const app = new Koa();

// 对于任何请求,app将调用该异步函数处理请求:
app.use(async (ctx, next) => {
    await next();
    ctx.response.type = 'text/html';
    ctx.response.body = '<h1>Hello, Koa2 World!</h1>';
});

// 在端口8080监听:
app.listen(8080);
console.log('http://localhost:8080');

在命令行进入js目录后,输入:node app.js运行server,之后在浏览器输入http://localhost:8080打开页面,可看到页面显示:
Hello, Koa2 World!
这样一个基本的server就完成了。

建立的server服务器每收到一个http请求,koa就会调用通过app.use()注册的async函数,并传入ctx和next参数。我们可以对ctx操作,并设置返回内容。
koa把很多async函数组成一个处理链,每个async函数都可以做一些自己的事情,然后用await next()来调用下一个async函数。我们把每个async函数称为middleware,这些middleware可以组合起来,完成很多有用的功能。

例如,可以用以下3个middleware组成处理链,依次打印日志,记录处理时间,输出HTML:

var Koa = require('koa')
var app = new Koa();
//第1个middleware
app.use(async (ctx, next)=>{
  console.log(`${ctx.request.method} ${ctx.request.url}`); // 打印URL
  await next(); // 调用下一个middleware
});
//第2个middleware
app.use(async (ctx, next)=>{
  const start = new Date().getTime(); // 当前时间
  await next(); // 调用下一个middleware
  const ms = new Date().getTime() - start; // 耗费时间
  console.log(`Time: ${ms} ms`) // 打印耗费时间
});
//第3个middleware
app.use(async (ctx, next)=>{
  await next();
  ctx.response.type = 'text/html';
  ctx.response.body = '<h1>Hello Koa2!!!</h1>';
});

app.listen(3000)
console.log('http://localhost:3000')

插件的输出的结果为:
GET /
Time: 3 ms

middleware的顺序很重要,也就是调用app.use()的顺序决定了middleware的顺序。但是当执行到最后一个await next()后,它继续执行顺序是什么呢?
我们把每一个插件的await next()前后都加入一些log信息看看:

app.use(async (ctx, next)=>{
  console.log(`1-1: ${ctx.request.method} ${ctx.request.url}`);
  await next();
  console.log('1-2')
});

app.use(async (ctx, next)=>{
  const start = new Date().getTime();
  console.log('2-1')
  await next();
  console.log('2-2')
  const ms = new Date().getTime() - start;
  console.log(`Time: ${ms} ms`)
});

app.use(async (ctx, next)=>{
  console.log('3-1')
  await next();
  console.log('3-2')
  ctx.response.type = 'text/html';
  ctx.response.body = '<h1>Hello Koa2!!!</h1>';
});

输出结果为:
1-1: GET /
2-1
3-1
3-2
2-2
Time: 4 ms
1-2

可以看到插件是按照顺序执行的await next()之前的1,2,3,之后按照倒序执行的3,2,1
是不是顺间就明白了koa的middleware的执行顺序了。

如果您觉得文章有用,请帮忙点个赞或关注,也为我鼓励一下,坚持写下去,在此感谢🙏!

转载一定注明出处!
原文地址:https://www.jianshu.com/p/a814b24a5330
2020年2月10日 新冠状病毒期间憋在家

本文参考文章:https://www.liaoxuefeng.com/wiki/1022910821149312/1099752344192192

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容

  • Koa 学习 历史 Express Express是第一代最流行的web框架,它对Node.js的http进行了封...
    Junting阅读 2,818评论 0 0
  • 参考资料 https://chenshenhai.github.io/koa2-note/note/static/...
    JunChow520阅读 10,485评论 1 8
  • 框架提出的背景 ES6/7带来的变革 自ES6确定和ES7中async/await开始普及,Node的发展变得更加...
    宫若石阅读 8,499评论 1 14
  • 原文链接:http://www.jianshu.com/p/6b816c609669 前传 出于兴趣最近开始研究k...
    悬笔e绝阅读 7,216评论 1 11
  • Q1:什么是中间件 中间件(Middleware),也叫中介层,是提供系统软件和应用软件之间连接的软件,便于软件各...
    BubbleM阅读 551评论 0 0