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学习(五)中间件的更多相关文章

  1. koa2学习(二) 中间件router

    中间件 koa-router 安装 npm install --save koa-router 使用 const Koa = require('koa'); const Router = requir ...

  2. {Django基础九之中间件} 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证

    Django基础九之中间件 本节目录 一 前戏 二 中间件介绍 三 自定义中间件 四 中间件的执行流程 五 中间件版登陆认证 六 xxx 七 xxx 八 xxx 一 前戏 我们在前面的课程中已经学会了 ...

  3. Koa2学习(八)使用session

    Koa2学习(八)使用session koa2框架不提供session的处理方法,这里我们需要借助一个第三方中间件koa-session来处理session. 先安装插件: $ npm i koa-s ...

  4. Koa2学习(六)使用koa-router

    Koa2学习(六)使用koa-router 配置简单路由 引入中间件 配置需要的路由 通过app.use注册路由 const Koa = require('koa') const app = new ...

  5. Koa2学习(一)环境搭建

    Koa2学习(一)环境搭建 koa2脚手架 koa2服务安装 koa2-generator目录结构 什么是 Koa2 koa 是由 Express 原班人马打造的,致力于成为一个更小.更富有表现力.更 ...

  6. TweenMax动画库学习(五)

    目录            TweenMax动画库学习(一)            TweenMax动画库学习(二)            TweenMax动画库学习(三)            Tw ...

  7. SVG 学习<五> SVG动画

    目录 SVG 学习<一>基础图形及线段 SVG 学习<二>进阶 SVG世界,视野,视窗 stroke属性 svg分组 SVG 学习<三>渐变 SVG 学习<四 ...

  8. Android JNI学习(五)——Demo演示

    本系列文章如下: Android JNI(一)——NDK与JNI基础 Android JNI学习(二)——实战JNI之“hello world” Android JNI学习(三)——Java与Nati ...

  9. ZigBee学习五 无线温度检测

    ZigBee学习五 无线温度检测 1)修改公用头文件GenericApp.h typedef union h{ uint8 TEMP[4]; struct RFRXBUF { unsigned cha ...

随机推荐

  1. Python旅途——函数(1)

    函数 简介 到目前为止,我们一直所接触的都是属于面向过程编程,这样的代码会降低代码的可读性,因此引入了函数式编程,在后面我们还会学到面向对象编程. 函数式编程 函数本质:将N行代码拿到别处,并给他起个 ...

  2. 大数据学习——linux常用命令(三)

    三 文件操作 1创建文件 touch somefile.txt 创建一个空文件somefile.txt > 重定向操作符 echo "woshiwoa"> some.t ...

  3. You Are the One (区间DP)

    The TV shows such as You Are the One has been very popular. In order to meet the need of boys who ar ...

  4. Robot Framework中的未解之谜

    今天在写测试用例的时候偶然发现了一个问题: 一.看脚本逻辑上没有问题,但是在引用变量的时候不能成功引用,脚本截图如下: 这个是关键字A的截图,没有参数. 此时在case中引用${phonesign}和 ...

  5. 【优先级队列】Southwestern Europe Regional Contest Canvas Painting

    https://vjudge.net/contest/174235#problem/D [题意] 给定n个已知size的帆布,要给这n块帆布涂上不同的颜色,规则是这样的: 每次选择一种颜色C 对于颜色 ...

  6. CF830B:Cards Sorting

    对叠放着的n张牌,第i张牌写有数字Ai,进行操作:将牌堆顶的牌取出,若是当前牌堆最小值就扔掉,否则放到牌堆底,求牌堆空时操作次数. 怎么看怎么像约瑟夫..不过约瑟夫DP我不太熟,于是就yy了一下 “当 ...

  7. Swift--方法(函数)

    方法是执行特殊任务的自包含代码块.你可以给方法名字来表示它的功能,而且在需要的时候调用这个名字的方法来执行它的任务. Swift方法的语法表达很灵活,从类似c的没有参数名的方法到oc复杂的带有名字和参 ...

  8. Segments--poj3304(判断直线与线段之间的关系)

    http://poj.org/problem?id=3304 给你几条线段  然后 让你找到一条直线让他在这条直线上的映射有一个重合点 如果有这条直线的话  这个重合的部分的两个端点一定是某两条线段的 ...

  9. Spring @Value用法

    Spring 通过注解获取*.porperties文件的内容,除了xml配置外,还可以通过@value方式来获取. 使用方式必须在当前类使用@Component,xml文件内配置的是通过pakage扫 ...

  10. pycharm查看代码注释的方法,代码编写日志及作者信息等

    竟然在边栏有个右键的快捷键.annotate可以查看代码书写日期及作者 鼠标悬停可以看到更加详细的时间等信息 原理应该是利用git blame