koa-router路由参数和前端路由的结合详解


Posted in Javascript onMay 19, 2019

koa-router 定制路由时支持通过冒号形式在 url 中指定参数,该参数会挂载到 context 上然后可通过 context.params.paramName 方便地获取。

考察下面的示例:

var Koa = require("koa");
var Router = require("koa-router");

var app = new Koa();
var router = new Router();

router.get("/user/:id", async function(ctx, next) {
 const userId = ctx.params.id;
 ctx.body = `user id is:${userId}`;
});

app.use(router.routes()).use(router.allowedMethods());

app.listen(3000);

console.log("server started at http:localhost:3000");

启动服务后可看到页面中展示出了从 url 中获取到的 id 参数。

koa-router路由参数和前端路由的结合详解

路由参数的获取展示

现在来考虑另一种情况,即路由中支持前端路由的情况。

即把现在的 url 由 /user/:id 的形式扩展成 /user/:id/foo/bar,这里 /foo/bar 部分可以是任何路由,作为前端处理的路由部分。

为了实现这样的前端路由部分,服务端路由的配置需要借助正则来进行,

- router.get("/user/:id", async function(ctx, next) {
+ router.get(["/user/:id", /\/user\/([\w|\d]+)\/.*/], async function(ctx, next) {
 const userId = ctx.params.id;
 ctx.body = `user id is:${userId}`;
});

这里将路由中 url 由单个字符串变成了数组形式,第一个还是原来的路由,这样正常的通过 /user/1 形式过来的页面能命中该路由。同时添加 /\/user\/([\w|\d]+)\/.*/ 部分,因为正则情况下不再支持路由中通过冒号进行参数的配置,所以这里 /user/ 后跟随的 id 也需要使用正则来替换掉。

但正则匹配下的路由就不能通过 context.params 来访问 url 上的参数了。不过好在可通过在正则中定义匹配组(Capturing Groups)的形式来定义参数,即其中 ([\w|\d]+) 括号包裹的部分,称为一个匹配组,一个匹配组是会自动被挂载到 context.params 上的,只是不像通过冒号定义的参数那样会有一个名字,这种形式的参数按照匹配到的顺序形成一个数组赋值到 context.params,所以访问第一个匹配组形成的参数可通过 context.params[0] 来获取。

于是上面的代码稍加修正后,就能够正确处理来自命名参数(通过冒号匹配)或正则参数形成的 query 参数了。

- router.get("/user/:id", async function(ctx, next) {
+ router.get(["/user/:id", /\/user\/([\w|\d]+)\/.*/], async function(ctx, next) {
- const userId = ctx.params.id;
+ const userId = ctx.params.id || ctx.params[0];
 ctx.body = `user id is:${userId}`;
});

最后完整的代码会是这样:

var Koa = require("koa");
var Router = require("koa-router");

var app = new Koa();
var router = new Router();

router.get(["/user/:id", /\/user\/([\w|\d]+)\/.*/], async function(ctx, next) {
 const userId = ctx.params.id || ctx.params[0];
 ctx.body = `user id is:${userId}`;
});

app.use(router.routes()).use(router.allowedMethods());

app.listen(3000);

console.log("server started at http:localhost:3000");

此时访问以下连接进行测试,

  • http://localhost:3000/user/1
  • http://localhost:3000/user/2/foo
  • http://localhost:3000/user/3/foo/bar

均能正确命中页面并成功获取到路由中的参数。

koa-router路由参数和前端路由的结合详解

正则路由及路由参数的获取

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对三水点靠木的支持。

Javascript 相关文章推荐
jQuery点击tr实现checkbox选中的方法
Mar 19 Javascript
基于JavaScript 声明全局变量的三种方式详解
May 07 Javascript
js向上无缝滚动,网站公告效果 具体代码
Nov 18 Javascript
javascript每日必学之条件分支
Feb 17 Javascript
那些精彩的JavaScript代码片段
Jan 12 Javascript
微信小程序 五星评价功能的实现
Mar 09 Javascript
详解vue.js的devtools安装
May 26 Javascript
AngularJS自定义指令详解(有分页插件代码)
Jun 12 Javascript
微信小程序实现倒计时60s获取验证码
Apr 17 Javascript
详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
Jul 24 Javascript
Vue filter格式化时间戳时间成标准日期格式的方法
Sep 16 Javascript
微信小程序实现多选删除列表数据功能示例
Jan 15 Javascript
Vue.js中该如何自己维护路由跳转记录
May 19 #Javascript
利用Vue实现一个markdown编辑器实例代码
May 19 #Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
May 18 #Javascript
微信小程序实现搜索指定景点周边美食、酒店
May 18 #Javascript
vue+高德地图写地图选址组件的方法
May 18 #Javascript
微信小程序实现搜索功能并跳转搜索结果页面
May 18 #Javascript
js实现图片推拉门效果代码实例
May 18 #Javascript
You might like
如何在PHP中使用Oracle数据库(6)
2006/10/09 PHP
PHP form 表单传参明细研究
2009/07/17 PHP
PHP访问MYSQL数据库封装类(附函数说明)
2010/12/04 PHP
PHP实用函数分享之去除多余的0
2015/02/06 PHP
php $_SESSION会员登录实例分享
2021/01/19 PHP
PHP使用pear实现mail发送功能 windows环境下配置pear
2016/04/15 PHP
PHP异步进程助手async-helper
2018/02/05 PHP
js中一维数组和二位数组中的几个问题示例说明
2014/07/17 Javascript
基于javascript代码实现通过点击图片显示原图片
2015/11/29 Javascript
浅谈$('div a') 与$('div>a')的区别
2016/07/18 Javascript
利用jQuery实现打字机字幕效果实例代码
2016/09/02 Javascript
通过构造函数实例化对象的方法
2017/06/28 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
Node Puppeteer图像识别实现百度指数爬虫的示例
2018/02/22 Javascript
在vue项目中引入高德地图及其UI组件的方法
2018/09/04 Javascript
深入解析koa之中间件流程控制
2019/06/17 Javascript
javascript中的数据类型检测方法详解
2019/08/07 Javascript
基于vue、react实现倒计时效果
2019/08/26 Javascript
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
Python队列的定义与使用方法示例
2017/06/24 Python
Python3计算三角形的面积代码
2017/12/18 Python
Django配置跨域并开发测试接口
2020/11/04 Python
10分钟理解CSS3 FlexBox弹性布局
2018/12/20 HTML / CSS
一款html5 canvas实现的图片玻璃碎片特效
2014/09/11 HTML / CSS
宿舍违规用电检讨书
2014/02/16 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
汇报材料怎么写
2014/12/30 职场文书
领导工作表现评语
2015/01/04 职场文书
研究生简历自我评
2015/03/11 职场文书
2019运动会广播加油稿汇总
2019/08/21 职场文书
如何使用CocosCreator对象池
2021/04/14 Javascript
浅谈Mysql多表连接查询的执行细节
2021/04/24 MySQL
Python的这些库,你知道多少?
2021/06/09 Python
Java中CyclicBarrier和CountDownLatch的用法与区别
2021/08/23 Java/Android
Python爬虫网络请求之代理服务器和动态Cookies
2022/04/12 Python