浅析koa路由及其中间件
文章目录
- Koa路由
- 什么是路由?
- 路由的安装
- 路由的匹配
- koa动态路由
- 中间件
- 什么是中间件
- 中间件的功能
- 应用级中间件
- 路由中间件
- 错误机制处理中间件
- koa中间件的执行顺序——洋葱模型
Koa路由
什么是路由?
一路径加一方法(路径URL+特定HTTP方法),也就是说路由是根据不同的URL地址,加载不同的页面并实现不同的功能
路由的安装
Koa中的路由我们需要安装koa-router路由模块来实现,在cmd中输入如下指令
安装指令:npm install --save koa-router
路由的匹配
安装完成后,我们进行路由的匹配,主要分为三步:
- 引入所需模块
- 规划路由
- 启动路由
先看第一步:引入所需模块
var Koa=require(“koa”); //*引入koa框架*var router=require(“koa-router”); //*引入路由模板*var app=new koa();
再看一下第三步: 启动路由
app.use(router.routes()) //*使用router.routes()必须先定义好它的routes*app.use(router.allowedMethods()) //*可配置可不配置,官方文档的推荐用法*
具体的定义也就是 规划路由
router.get('/',async(ctx)=>{ctx.body="首页";
})
router.get('/news',async(ctx)=>{ctx.body="新闻页面";
})
①这里ctx是context的缩写,在中文翻译中是上下文的意思,我们可以把它理解为request和response沟通的环境,req和res这两个属性是之前express框架使用的方式,现在koa把它们都封装到ctx中
②body是http协议中的响应体,header是指响应头
③ctx.body=ctx.res.body=ctx.response.body(ctx.body属性也就是发送给用户的内容)
④‘/’表示首页
最后一定不要忘了连接端口!
app.listen(3002); //这里选了3002端口
整段代码是这个样子的:
var koa = require('koa');
var router = require('koa-router')();
var app=new koa();router.get('/',async(ctx)=>{ctx.body="首页";
})
router.get('/news',async(ctx)=>{ctx.body="新闻页面";
})app.use(router.routes());
app.listen(3002);
测试一下,在网址里输入localhost:3002看一下效果
再加个news看看效果
这样一个简单的路由使用就完成了~
koa动态路由
请求方式——http://域名/模块名/参数(下面的例子中设置了两个参数)
router.get('/newscontent',async(ctx)=>{console.log("这是新闻2");
})
router.get('/newscontent/:aid/:cid',async(ctx)=>{console.log(ctx.params);ctx.body="新闻详情";
}) //注意一下这里两个参数的设置方式
瞅一眼效果
后台是这个样子的
中间件
什么是中间件
配合路由匹配完成所做的一系列操作就叫中间件
中间件的功能
执行任何代码
修改请求和响应对象
终结请求-相应循环
调用堆栈里的下一个中间件
应用级中间件
app.use是express调用中间件的方法,所谓中间件就是处理HTTP请求的参数,用来完成各种特定的任务比如检查用户是否登录,分析数据,以及其他的需要最终将数据发送给 用户之前完成的任务。app.use()里面使用的参数主要是函数,这个使用并不是函数调用而是使能的意思,当用户在浏览器发出请求的时候这部分函数才会启用,进行过滤处理
/*匹配路由前打印日期*/
app.use(async(ctx,next)=>{ctx.body='中间件';console.log(new Date());await next();/*当前路由完成以后继续向下匹配,这个中间件可以匹配任何路由,但如果不写next这个路由被匹配了就不会向下匹配*/
})
注:这里的参数next是koa框架调用中间件的方式,直接执行app.use之后再执行下一个app.use,下一个app.use也就是next参数,它是一个函数
路由中间件
路由中间件我们在前面就已经零零星星的见过它了,就是下面这些
router.get('/',async(ctx)=>{ctx.body="首页";
})router.get('/news',async(ctx)=>{ctx.body="新闻列表页面";
})router.get('/newscontent/:aid/:cid',async(ctx)=>{console.log(ctx.params);ctx.body="新闻详情";
})
错误机制处理中间件
在程序执行过程中,会不可避免的出现一些无法预料的失误,错误中间件就是一个集中处理错误的地方
app.use(async(ctx,next)=>{next();if(ctx.status==404){ctx.status=404;ctx.body="这是一个404界面";}else{console.log(ctx.url);}
})
这串代码中显示的便是当访问的数据不存在时,在浏览器上显示这是一个404界面,作为一种对错误的处理
此外还有一个第三方中间件,虽然不会用,但有必要在中间件里留下它的姓名
koa中间件的执行顺序——洋葱模型
先来个图,这个执行顺序的样子就很像横着切开的洋葱,一层一层的
中间件函数队列,会在最后一个中间件或一个没有调用next的中间件那里停止
koa官方文档上把外层的中间件称为"上游",内层的中间件为"下游"
一般的中间件都会执行两次,调用next之前为第一次,调用next时把控制传递给下游的下一个中间件。当下游不再有中间件或者没有执行next函数时,就将依次恢复上游中间件的行为,让上游中间件执行next之后的代码–洋葱模型
举个例子:
var Koa=require('koa');
var router = require('koa-router')();
var app=new Koa();//Koa中间件
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(3002);
去后台看一下数据,界面如下:
最后转一篇超详细的博客,举了很多个实例,可以更深入的理解koa中间件执行顺序
koa洋葱模型的实例
以上如有写的不正确的地方,还请大家指出,希望可以帮到大家
浅析koa路由及其中间件相关推荐
- 浅析深究什么是中间件 发布时间: 2016-06-10 作者:本站编辑 浏览次数:128 摘要: 因为工作的原因,我从金蝶集团调入金蝶中间件公司工作以来,经常遇到一个问题就是中间件公司是个什么
浅析深究什么是中间件 发布时间: 2016-06-10 作者:本站编辑 浏览次数:128 摘要: 因为工作的原因,我从金蝶集团调入金蝶中间件公司工作以来,经常遇到一个问题就是中间件公司是个什么 ...
- nodejs开发 过程中express路由与中间件的理解 - pyj063 - 博客园
nodejs开发 过程中express路由与中间件的理解 nodejs开发 express路由与中间件 路由 通常HTTP URL的格式是这样的: http://host[:port][path] h ...
- NodeJS入门04-Express路由和中间件 - 小之 - 博客园
nodeJS入门04-Express路由和中间件 Express框架是后台的Node框架,在后台的受欢迎的程度,和jQuery一样,就是企业的事实上的标准. 路由 路由是指如何定义应用的端点(URIs ...
- express 路由中间件_Express通过示例进行解释-安装,路由,中间件等
express 路由中间件 表达 (Express) When it comes to build web applications using Node.js, creating a server ...
- php路由中间件,lumen5.5学习路由和中间件(四)
前几篇了解完从请求到响应的流程后,仔细学习下路由和中间件的玩法 ----------------------------------分割线------------------------------- ...
- 渲染静态页面、get请求、post请求、express框架、路由、中间件
1. 渲染静态页面 const http = require('http'); const fs = require('fs'); const url = require('url'); const ...
- 初识洋葱模型,分析中间件执行过程,浅析koa中间件源码
前言 作为洋葱模型的第一篇文章,这里仅介绍了一些入门级知识,比如 了解洋葱模型执行顺序 分析部分 koa 中间件的源码来加深对中间件的认识 为第二篇文章:分析洋葱模型实现原理,在自己项目中接入洋葱模型 ...
- node.js express php,nodejs开发——express路由与中间件
路由 通常HTTP URL的格式是这样的: http表示协议. host表示主机. port为端口,可选字段,不提供时默认为80. path指定请求资源的URI(Uniform Resource Id ...
- express 框架之 路由与中间件
1. 什么是router路径,什么是middleware? 我们输入www.baidu.com 来访问百度的主页,浏览器会自动转换为 http://www.baidu.com:80/(省略一些参数) ...
最新文章
- RandomForestClassifier参数min_samples_leaf和min_samples_split理解
- 创业者周鸿祎前传(西安交大时期)
- rosdep init和rosdep update出错处理
- Android——设置布局的背景颜色
- rtklib 后处理_RTKLIB 手册解读及代码调试知识总结
- 【工具】支付宝免费卡校验接口调用及常用银行简称整理
- ThinkPHP5.1 子查询-使用 Group 获取每组最新数据
- 安装office,错误1706。安装程序找不到所需文件。请检查网络连接或CD-ROM驱动器。
- 如何将 Excel 数据分组后按次序横向排列
- UnicodeEncodeError: 'gbk' codec can't encode character '\uXXX' in position
- 【jquery】删除节点 添加节点 找兄弟节点
- url中如果有引号的处理
- CentOS服务器的安装
- 计算机怎么查询隐藏的字体,Win10怎么隐藏不使用的字体?隐藏字体的方法
- linux下IIC驱动解释
- linux4==阿里云ECS centos8部署redis6.2.6伪集群
- SEO优化技巧,并不是词库排名优化操作那么简单!
- 营销值得学:普通人怎么创业?创业需要具备哪些能力?
- 树莓派+ubuntu18.04+ROS-melodic+MAVROS+librealsense+vio+realsense_ros
- java IDE 工具启动tomcat 时 启动不起来 一直报错的一个原因
热门文章
- 微软AI秀肌肉:Windows之后,用Azure收割市场
- 在线英语单词词根查询!
- 搜刮的好东西:网站运营管理策划书模版
- ARC,block,protocol,代理设计模式
- Gavin老师Transformer直播课感悟 - Rasa项目实战之电商零售智能业务对话机器人ResponseSelector使用详解与Debugging演示(八十八)
- voliate解决重排序
- Points-to analysis工具Doop的基本使用(2)
- 2020R1快开门式压力容器操作作业考试题库及R1快开门式压力容器操作模拟考试题库
- SSH无密登录原理及配置方法
- Python(1) 概述与环境安装