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基础003

    1. list 1.1 基础 list是一组有序的集合序列,可以包含任何类型且不必相同,并支持嵌套.采用如下创建方式: li = ["spam",2.0,5,[10,20]] 列表 ...

  2. C#语言之字符串和正则表达式

    本文将完成以下两个目标: 一.创建字符串: 二.正则表达式: 首先,我先来介绍一下System.String类: System.String是一个类,专门用于存储字符串,允许对字符串进行许多操作. 使 ...

  3. 访问变量的每个字节内容(c语言)

    #include <stdio.h> #define fun(x) for(int fun_i = 0; fun_i < sizeof(x); fun_i++){printf(&qu ...

  4. sql使用row_number()查询标记行号

    背景: 在分页功能中,记录需分页显示,需要row_number()函数标记行号. 数据表: 排序之前数据表显示: sql语句: select ROW_NUMBER() over(order by id ...

  5. 【Kubernetes】kube-dns 持续重启

    kuberbetes部署和启动正常,但是kube-dns持续重启 使用命令 kubectl get pods --all-namespaces 得到结果 从图中可以看出kube-dns-c7d8589 ...

  6. hihoCoder#1127 二分图三·二分图最小点覆盖和最大独立集

    原题地址 主要是介绍了两个定理: 1. 二分图最大匹配数    = 二分图最小点覆盖数 2. 二分图最小点覆盖数 = 二分图顶点数 - 二分图最小点覆盖数 注意,都是二分图 代码:(匈牙利算法) #i ...

  7. Divide Groups(分组)(二分图染色)

    题目链接 题目大意是说输入数字n 然后告诉你第i个人都认识谁? 让你把这些人分成两堆,使这每个堆里的人都互相认识. 做法:把不是互相认识的人建立一条边,则构建二分图,两堆的人肯定都互相认识,也就是说, ...

  8. selenide01---截图

    1.junit:import com.codeborne.selenide.junit.ScreenShooter; @Rule public ScreenShooter makeScreenshot ...

  9. 网络安全法与LogSec日志安全大数据审计平台

    https://blog.csdn.net/chengpeng1144/article/details/73555331 https://blog.csdn.net/dcbeyond/article/ ...

  10. 洛谷—— P3372 【模板】线段树 1

    P3372 [模板]线段树 1 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别 ...