iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 中间件用法
来源:互联网 发布:电视剧直播软件 编辑:程序博客网 时间:2024/06/05 06:09
中间件用法——讲解 Koa2 中间件的用法及如何开发中间件
���� iKcamp 制作团队
原创作者:大哼、阿干、三三、小虎、胖子、小哈、DDU、可木、晃晃
文案校对:李益、大力萌、Au、DDU、小溪里、小哈
风采主播:可木、阿干、Au、DDU、小哈
视频剪辑:小溪里
主站运营:给力xi、xty
教程主编:张利涛
视频地址:https://www.cctalk.com/v/15114357763623
文章
middleware 中间件
正是因为中间件的扩展性才使得
Koa
的代码简单灵活。
在 app.js
中,有这样一段代码:
app.use(async (ctx, next)=>{ await next() ctx.response.type = 'text/html' ctx.response.body = '<h1>Hello World</h1>' })
它的作用是:每收到一个 http
请求,Koa
都会调用通过 app.use()
注册的 async
函数,同时为该函数传入 ctx
和 next
两个参数。而这个 async
函数就是我们所说的中间件。
下面我们简单介绍一下传入中间件的两个参数。
ctx
ctx
作为上下文使用,包含了基本的 ctx.request
和 ctx.response
。另外,还对 Koa
内部对一些常用的属性或者方法做了代理操作,使得我们可以直接通过 ctx
获取。比如,ctx.request.url
可以写成 ctx.url
。
除此之外,Koa
还约定了一个中间件的存储空间 ctx.state
。通过 state
可以存储一些数据,比如用户数据,版本信息等。如果你使用 webpack
打包的话,可以使用中间件,将加载资源的方法作为 ctx.state
的属性传入到 view
层,方便获取资源路径。
next
next
参数的作用是将处理的控制权转交给下一个中间件,而 next()
后面的代码,将会在下一个中间件及后面的中间件(如果有的话)执行结束后再执行。
注意: 中间件的顺序很重要!
我们重写 app.js
来解释下中间件的流转过程:
// 按照官方示例const Koa = require('koa')const app = new Koa()// 记录执行的时间app.use(async (ctx, next) => { let stime = new Date().getTime() await next() let etime = new Date().getTime() ctx.response.type = 'text/html' ctx.response.body = '<h1>Hello World</h1>' console.log(`请求地址: ${ctx.path},响应时间:${etime - stime}ms`)});app.use(async (ctx, next) => { console.log('中间件1 doSoming') await next(); console.log('中间件1 end')})app.use(async (ctx, next) => { console.log('中间件2 doSoming') await next(); console.log('中间件2 end')})app.use(async (ctx, next) => { console.log('中间件3 doSoming') await next(); console.log('中间件3 end')})app.listen(3000, () => { console.log('server is running at http://localhost:3000')})
运行起来后,控制台显示:
server is running at http://localhost:3000
然后打开浏览器,访问 http://localhost:3000
,控制台显示内容更新为:
server is running at http://localhost:3000中间件1 doSoming中间件2 doSoming中间件3 doSoming中间件3 end中间件2 end中间件1 end请求地址: /,响应时间:2ms
从结果上可以看到,流程是一层层的打开,然后一层层的闭合,像是剥洋葱一样 —— 洋葱模型。
此外,如果一个中间件没有调用 await next()
,会怎样呢?答案是『后面的中间件将不会执行』。
修改 app.js
如下,我们去掉了第三个中间件里面的 await
:
const Koa = require('koa')const app = new Koa()// 记录执行的时间app.use(async (ctx, next)=>{ let stime = new Date().getTime() await next() let etime = new Date().getTime() ctx.response.type = 'text/html' ctx.response.body = '<h1>Hello World</h1>' console.log(`请求地址: ${ctx.path},响应时间:${etime - stime}ms`)});app.use(async (ctx, next) => { console.log('中间件1 doSoming') await next(); console.log('中间件1 end')})app.use(async (ctx, next) => { console.log('中间件2 doSoming') // 注意,这里我们删掉了 next // await next() console.log('中间件2 end')})app.use(async (ctx, next) => { console.log('中间件3 doSoming') await next(); console.log('中间件3 end')})app.listen(3000, () => { console.log('server is running at http://localhost:3000')})
重新运行代码后,控制台显示如下:
server is running at http://localhost:3000中间件1 doSoming中间件2 doSoming中间件2 end中间件1 end请求地址: /,响应时间:1ms
与我们的预期结果『后面的中间件将不会执行』是一致的。
下一篇:我们将学习下如何响应浏览器的各种请求。
上一篇:iKcamp新课程推出啦~~~~~iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 环境准备
推荐: 翻译项目Master的自述:
干货|人人都是翻译项目的Master
- iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 中间件用法
- iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 路由koa-router
- iKcamp团队制作|基于Koa2搭建Node.js实战项目教学(含视频)☞ 环境准备
- 开始连载啦~每周2更共11堂iKcamp课|基于Koa2搭建Node.js实战项目教学(含视频)| 课程大纲介绍
- node.js之快速搭建koa2项目
- Node.js实战关于cookie-parser中间件
- 使用Node+Koa2+Mysql搭建简易博客
- node js Formidable中间件
- iKcamp出品微信小程序教学共5章16小节汇总(含视频)
- 基于Node.js搭建TCP聊天服务器
- 基于Node.js搭建静态服务器
- 基于 Node.js 搭建 HTTP/2服务
- node.js之koa2快速项目目录分析
- Node.js实战(1)
- 微信小程序教学第三章(含视频):小程序中级实战教程:列表-静态页面制作
- 微信小程序教学第四章第一节(含视频):小程序中级实战教程:详情-页面制作
- node.js redis缓存中间件
- Node — Koa2
- 一位资深程序员的程序人生总结十三条
- Rxjava2+Retrofit2请求验证码,请求头加入JSESSIONID。
- 枚举算法1
- 3D轮播图与外层ViewPager滑动冲突问题
- Mybatis
- iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 中间件用法
- CORS 跨域 access-control-allow-headers 的问题
- 每天一个linux命令(30): chown命令
- 请手动释放你的资源(Please release resources manually)
- 批量行编辑,批量去注释
- 解决svn代码冲突问题
- 关于最新最热的guns框架的token验证
- SharePoint Patterns and Practices 简介
- Scrapy: 如何设置代理