Koa2学习(五)中间件
Koa2学习(五)中间件
Koa2通过app.use(function)方法来注册中间件。
所有的http请求都会依次调用app.use()方法,所以中间件的使用顺序非常重要。
中间件的执行顺序
官方说明:
假设依次有 A、B 两个中间件,首先请求流通过 A 中间件,然后继续移交控制给 B 中间件。当一个中间件调用 next() 则该函数暂停并将控制传递给定义的下一个中间件。当在下游没有更多的中间件执行后,堆栈将展开并且每个中间件恢复执行其上游行为。
我们来做个简单的测试,写三个中间件来测试执行顺序:
const Koa = require('koa')
const app = new Koa()
app.use(async (ctx, next) => {
console.log('http request 1')
await next()
console.log('http request end 1')
})
app.use(async (ctx, next) => {
console.log('http request 2')
await next()
console.log('http request end 2')
})
app.use(async (ctx, next) => {
console.log('http request 3')
await next()
console.log('http request end 3')
})
app.listen(8000)
module.exports = app
模拟了一个请求之后,可以看到node.js控制台依次输出:
http request 1
http request 2
http request 3
http request end 3
http request end 2
http request end 1
因此,可以得知官网的意思是:中间件中的方法,会以一个栈结构的顺序来执行,先由上至下依次执行,在遇到await next()方法后,会暂停该中间件的执行,执行下一个中间件,当所有的中间件都执行完毕时,再由下往上依次执行每个中间件next 后面的方法。
实现一个简单的log time中间件
知道了中间件的执行原理,写一个中间件就非常简单了。
例如实现一个简单的打印请求耗时的中间件只需要简单的几行代码:
app.use(async (ctx, next) => {
const url = ctx.url
const method = ctx.method
console.time(`-- ${method} ${url} cost`)
await next()
console.timeEnd(`-- ${method} ${url} cost`)
})
在浏览器发起一个请求localhost:8000?username=zj。
在node.js控制台打印:
-- GET /?username=zj cost: 2.337ms
-- GET /favicon.ico cost: 0.159ms
可以看到第一个是正常请求的log,第二个是请求图标的log。
koa-bodyparser
koa-bodyparser中间件能够帮我们自动解析post参数。
通过koa-bodyparser,我们能够很方便的在ctx.request.body里面直接获取到解析好的数据。
请看代码:
const Koa = require('koa')
const app = new Koa()
const bodyparser = require('koa-bodyparser')
app.use(bodyparser({
enableTypes:['json', 'form', 'text']
}))
app.use(async ctx => {
const req = ctx.request
const url = req.url // 请求的url
const method = req.method // 请求的方法
console.log(req.body)
ctx.body = req.body
})
app.listen(8000)
module.exports = app
通过curl模拟请求:
$ curl -i -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":100}' http://localhost:8000
可以看到node.js控制台输出:
{ id: 100 }
koa-router
koa-router是一款官方默认的路由中间件,如果我们自己实现路由的话,可能需要手动去判断请求url,再返回不同的响应,但是有了koa-router中间件之后,我们可以很方便的对路由进行系统化的管理。
具体使用方法我们在下节再讲。
Koa2学习(五)中间件的更多相关文章
- koa2学习(二) 中间件router
中间件 koa-router 安装 npm install --save koa-router 使用 const Koa = require('koa'); const Router = requir ...
- {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证
Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...
- Koa2学习(八)使用session
Koa2学习(八)使用session koa2框架不提供session的处理方法,这里我们需要借助一个第三方中间件koa-session来处理session. 先安装插件: $ npm i koa-s ...
- Koa2学习(六)使用koa-router
Koa2学习(六)使用koa-router 配置简单路由 引入中间件 配置需要的路由 通过app.use注册路由 const Koa = require('koa') const app = new ...
- Koa2学习(一)环境搭建
Koa2学习(一)环境搭建 koa2脚手架 koa2服务安装 koa2-generator目录结构 什么是 Koa2 koa 是由 Express 原班人马打造的,致力于成为一个更小.更富有表现力.更 ...
- TweenMax动画库学习(五)
目录 TweenMax动画库学习(一) TweenMax动画库学习(二) TweenMax动画库学习(三) Tw ...
- SVG 学习<五> SVG动画
目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...
- Android JNI学习(五)——Demo演示
本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...
- ZigBee学习五 无线温度检测
ZigBee学习五 无线温度检测 1)修改公用头文件GenericApp.h typedef union h{ uint8 TEMP[4]; struct RFRXBUF { unsigned cha ...
随机推荐
- 【HDU 3037】Saving Beans(卢卡斯模板)
Problem Description Although winter is far away, squirrels have to work day and night to save beans. ...
- iframe in ipad safari
http://developer.apple.com/library/safari/#documentation/appleapplications/reference/safariwebconten ...
- 大数据学习——采集目录到HDFS
采集需求:某服务器的某特定目录下,会不断产生新的文件,每当有新文件出现,就需要把文件采集到HDFS中去 根据需求,首先定义以下3大要素 l 采集源,即source——监控文件目录 : spoold ...
- Android渲染器Shader:梯度渐变扫描渲染器SweepGradient(二)
Android渲染器Shader:梯度渐变扫描渲染器SweepGradient(二) 附录文章1介绍了线性渐变渲染器. Android的SweepGradient梯度渐变扫描,重点是在构造Swe ...
- java使用反射的好处
文章:框架使用java反射好处 讲了框架读取配置文件的类名,使用反射灵活的创建对象.不用在代码层面写死,可以在一些场合非常灵活. 文章:Java 反射在实际开发中的应用 还没具体
- POJ1061青蛙的约会
Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事 ...
- 【数学】codeforces C. Maximal GCD
http://codeforces.com/contest/803/problem/C [题意] 给定两个数n,k(1 ≤ n, k ≤ 10^10) 要你输出k个数,满足以下条件: ①这k个数之和等 ...
- 指针与数组的对比(——选自:C++内存管理技术内幕)
数组: 数组要么是在静态存储区上创建(如全局数组),要么是在栈上创建的.数组名代表着 段连续的内存,其地址和容量在生命周期内是不会改变的,而只能改变其数组内容. 指针: 指针是一种指针类型的变量,变量 ...
- vim—基本命令1
---------------------------------------------------------------2015.07.27 :b 1 -> 切换到当前缓冲区 :2 4 ...
- Visual Studio Code Edit
微软的跨平台编辑器~~ 下载地址(官网):https://code.visualstudio.com/ 下载地址(网盘):http://pan.baidu.com/s/1ntLy8Tr 使用技巧: c ...