跟我一起了解koa中间件

一、是 什么是 Koa 的中间件

通俗的讲: :中间件就是匹配路由之前或者匹配路由完成做的一系列的操作,我们就可以

把它叫做中间件。

在 在express件 中间件( (Middleware )是一个函数,它可以访问请求对象(request object (req)),

响应对象(response object (res)), 和 web 应用中处理请求-响应循环流程中的中间件,一

般被命名为 next 的变量。在 Koa 中中间件和 express 有点类似。

中间件的功能包括:

执行任何代码。

修改请求和响应对象。

终结请求-响应循环。

调用堆栈中的下一个中间件。

如果我的 get、post 回调函数中,没有 next 参数,那么就匹配上第一个路由,就不会往下匹

配了。如果想往下匹配的话,那么需要写 next()

二、Koa 应用可使用如下几种中间件:

应用级中间件

路由级中间件

错误处理中间件

第三方中间件

1.应用级中间件

//app.js
//在匹配路由之前,会打印出时间
//引入 koa模块 var Koa=require('koa');
var router = require('koa-router')(); /*引入是实例化路由** 推荐*/
var app=new Koa();
//Koa中间件 //匹配任何路由 ,如果不写next,这个路由被匹配到了就不会继续向下匹配
// 匹配路由之前打印日期
app.use(async(ctx,next)=>{
console.log(new Date())
await next()
})
router.get('/',async(ctx)=>{
ctx.body = "首页"
})
router.get('/news',async(ctx)=>{
ctx.body = "新闻列表页面"
})
router.get('/login',async(ctx)=>{
ctx.body = "新闻登录页面"
})
app.use(router.routes())//启动路由
app.use(router.allowedMethods());
app.listen(3004);

路由级中间件

//app1.js

//引入 koa模块

var Koa=require('koa');
var router = require('koa-router')(); /*引入是实例化路由** 推荐*/
var app=new Koa(); //Koa中间件 //匹配任何路由 ,如果不写next,这个路由被匹配到了就不会继续向下匹配 router.get('/',async (ctx)=>{ ctx.body="首页"; })
// 匹配到news路由以后继续向下匹配路由
router.get('/news',async (ctx,next)=>{
console.log('这是一个新闻1'); await next();
})
router.get('/news',async (ctx)=>{ ctx.body='这是一个新闻';
}) router.get('/login',async (ctx)=>{
ctx.body="新闻列表页面";
}) app.use(router.routes()); /*启动路由*/
app.use(router.allowedMethods());
app.listen(3002);

效果图



koa中的错误处理中间件

//app2.js
var Koa = require('koa')
var router = require('koa-router')()
var app = new Koa()
app.use(async(ctx,next)=>{
console.log('这是一个中间件01')
next()
if(ctx.status == 404){
ctx.status = 404
ctx.body = '这是一个404页面'
}else{
console.log(ctx.url)
}
})
router.get('/',async (ctx)=>{ ctx.body="首页"; })
router.get('/news',async (ctx)=>{
console.log('这是新闻2');
ctx.body='这是一个新闻';
})
router.get('/login',async (ctx)=>{
ctx.body="新闻列表页面";
})
app.use(router.routes()); /*启动路由*/
app.use(router.allowedMethods());
app.listen(3003);

我们看下效果,就知道这个错误处理中间件到底是什么问题了

4.koa中间件的执行流程

//app3.js

//引入 koa模块

var Koa=require('koa');
var router = require('koa-router')(); /*引入是实例化路由** 推荐*/
var app=new Koa(); //Koa中间件 //匹配任何路由 ,如果不写next,这个路由被匹配到了就不会继续向下匹配 //www.域名.com/news
app.use(async (ctx,next)=>{
console.log('1、这是第一个中间件01');
await next(); console.log('5、匹配路由完成以后又会返回来执行中间件');
}) app.use(async (ctx,next)=>{
console.log('2、这是第二个中间件02');
await next(); console.log('4、匹配路由完成以后又会返回来执行中间件');
}) router.get('/',async (ctx)=>{ ctx.body="首页"; })
router.get('/news',async (ctx)=>{ console.log('3、匹配到了news这个路由');
ctx.body='这是一个新闻';
}) app.use(router.routes()); /*启动路由*/
app.use(router.allowedMethods());
app.listen(3004);

跟我一起了解koa(三)的更多相关文章

  1. 基于 vue+vue-router+vuex+axios+koa+koa-router 本地开发全栈项目

    因为毕业设计要做基于Node服务器的项目,所以我就想着用刚学的vue作为前端开发框架,vue作为Vue.js应用程序的状态管理模式+库,axios基于promise用于浏览器和node.js的http ...

  2. Koa源码分析(三) -- middleware机制的实现

    Abstract 本系列是关于Koa框架的文章,目前关注版本是Koa v1.主要分为以下几个方面: Koa源码分析(一) -- generator Koa源码分析(二) -- co的实现 Koa源码分 ...

  3. 3-5 第三天 Koa 和 Express 中间件

    Koa和Express这两个框架除了在接收请求和返回数据方面有非常通用.好用的封装以外,最有价值的地方就是它们有自己的中间件机制,所以说中间件可以看做是流水线上一个又一个的加工房间,每个加工的房间都只 ...

  4. koa 项目实战(三)创建测试接口和用户模型

    1.创建测试接口,并引入用户模型 根目录/routes/api/users.js const Router = require('koa-router'); const router = new Ro ...

  5. koa 基础(三)路由的另一种写法

    1.配置路由 app.js // 引入模块 const Koa = require('koa'); const router = require('koa-router')(); /*引入是实例化路由 ...

  6. KOA 学习(三)

    请求(Request) Koa Request 对象是对 node 的 request 进一步抽象和封装,提供了日常 HTTP 服务器开发中一些有用的功能. req.header 请求头对象 requ ...

  7. Node.js+Koa开发微信公众号个人笔记(三)响应文本

    响应输入文本和响应事件类似,首先对微信服务器发送来的数据的MsgType进行处理,如果是text,说明是文本,接下来可以对文本内容进行处理,比如用户输入了1,可以给用户回复一个文本或者图文或者视频等信 ...

  8. 跟我一起了解koa之koa的cookie(三)

    代码中写入 然后我们每次刷新浏览器,代码里面的pvid都会改变 我们可以读取cookie 访问json数据出现结果

  9. Node.js实现RESTful api,express or koa?

    文章导读: 一.what's RESTful API 二.Express RESTful API 三.KOA RESTful API 四.express还是koa? 五.参考资料 一.what's R ...

随机推荐

  1. JS数组 一起组团(什么是数组)一个数组变量可以存放多个数据

    一起组团(什么是数组) 我们知道变量用来存储数据,一个变量只能存储一个内容.假设你想存储10个人的姓名或者存储20个人的数学成绩,就需要10个或20个变量来存储,如果需要存储更多数据,那就会变的更麻烦 ...

  2. [NOIP2019模拟赛]数数(gcd)

    题目大意: 求l~r中有多少数与x互质,带单点修改 分析: 两个30的部分分很好打: ·n<=1000暴力O(nq)就好了 ·$a_i<=100$用树状数组维护每个x的前缀和就好了 100 ...

  3. 在js中使用Razor

    @foreach (var tem in Model) { <text> time.push("@tem.CreateTime.ToString("G")&q ...

  4. display: -webkit-box; 做个小小试验

    最近做个微信项目发现css3在微信内部浏览器中和其他浏览有些区别 做个小小笔记 .job { display: -webkit-box; display: flexbox; -webkit-box-p ...

  5. shell脚本使用需要注意的地方

    shell脚本中,函数内部定义变量可以为局部变量和全局变量,局部变量使用local定义,全局变量不带local,全局变量可以在函数外部可见,如下: #!/bin/bash function calle ...

  6. SpringBoot配置自定义日期参数转换器

    1.自定义参数转换器 自定义参数转换器必须实现Converter接口 /** * Created by IntelliJ IDEA. * * @Auther: ShaoHsiung * @Date: ...

  7. 廖雪峰Java15JDBC编程-3JDBC接口-1JDBC简介

    JDBC:Java DataBase Connectivity Java程序访问数据库的标准接口 使用Java程序访问数据库的时候,Java代码并不是直接通过TCP连接去访问数据库,而是通过JDBC接 ...

  8. Ubuntu下使用SSH 命令用于登录远程桌面

    https://blog.csdn.net/yucicheung/article/details/79427578 问题描述 做DL的经常需要在一台电脑(本地主机)上写代码,另一台电脑(服务器,计算力 ...

  9. c语言学习笔记 - 指针和数组

    结合内存存储数据的机制,c语言里指针的出现和使用也就不奇怪了,如果先学了内存的一些知识,以及程序运行机制,到了c指针这块就会清晰很多. #include <stdio.h> int mai ...

  10. hdu 4563

    hdu 4563 把每个命令走的距离抽象成完全背包 枚举最后一个不是整点走完的命令 #include <iostream> #include <algorithm> #incl ...