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 相关文章推荐
JavaScript入门教程(7) History历史对象
Jan 31 Javascript
文本框中禁止非数字字符输入比如手机号码、邮编
Aug 19 Javascript
JavaScript匿名函数与委托使用示例
Jul 22 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
Feb 13 Javascript
jQuery插件FusionWidgets实现的Cylinder图效果示例【附demo源码】
Mar 23 jQuery
JS实现的加减乘除四则运算计算器示例
Aug 09 Javascript
javascript用rem来做响应式开发
Jan 13 Javascript
关于Vue源码vm.$watch()内部原理详解
Apr 26 Javascript
layui prompt 设置允许空白提交的方法
Sep 24 Javascript
用Golang运行JavaScript的实现示例
Nov 25 Javascript
Javascript异步执行不按顺序解决方案
Apr 30 Javascript
关于AngularJS中几种Providers的区别总结
May 17 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 mysql Errcode: 28 终极解决方法
2009/07/01 PHP
php下连接ftp实现文件的上传、下载、删除文件实例代码
2010/06/03 PHP
基于PHP生成静态页的实现方法
2013/05/10 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
PHP安全下载文件的方法
2016/04/07 PHP
PHP实现的62进制转10进制,10进制转62进制函数示例
2019/06/06 PHP
laravel框架中控制器的创建和使用方法分析
2019/11/23 PHP
jQuery中filter()和find()的区别深入了解
2013/09/25 Javascript
js数组循环遍历数组内所有元素的方法
2014/01/18 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
js实现透明度渐变效果的方法
2015/04/10 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
JavaScript几种数组去掉重复值的方法推荐
2016/04/12 Javascript
jQuery File Upload文件上传插件使用详解
2016/12/06 Javascript
详谈jQuery.load()和Jsp的include的区别
2017/04/12 jQuery
javascript观察者模式实现自动刷新效果
2017/09/05 Javascript
纯html+css+javascript实现楼层跳跃式的页面布局(实例代码)
2017/10/25 Javascript
微信小程序实现指定显示行数多余文字去掉用省略号代替
2018/07/25 Javascript
13 个npm 快速开发技巧(推荐)
2019/07/04 Javascript
稍微学一下Vue的数据响应式(Vue2及Vue3区别)
2019/11/21 Javascript
jquery实现点击弹出对话框
2020/02/08 jQuery
[09:47]2018DOTA2亚洲邀请赛4.5SOLO赛 No[o]ne vs Sumail
2018/04/06 DOTA
[01:17:55]VGJ.T vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/20 DOTA
Python使用自带的ConfigParser模块读写ini配置文件
2016/06/26 Python
Python3 利用requests 库进行post携带账号密码请求数据的方法
2018/10/26 Python
Django获取应用下的所有models的例子
2019/08/30 Python
Python 使用 Pillow 模块给图片添加文字水印的方法
2019/08/30 Python
python pandas.DataFrame.loc函数使用详解
2020/03/26 Python
Win 10下Anaconda虚拟环境的教程
2020/05/18 Python
美国孩之宝玩具官网:Hasbro Pulse
2019/06/24 全球购物
JACK & JONES荷兰官网:男士服装和鞋子
2021/03/07 全球购物
个人简历自荐信
2013/12/05 职场文书
我读书我快乐演讲稿
2014/05/07 职场文书
2019关于垃圾分类处理的调查报告
2019/12/26 职场文书
如何理解python接口自动化之logging日志模块
2021/06/15 Python
20180830晚上第一届KSL半决赛 雨神vs解冻(二龙 三炮解说)
2022/04/01 星际争霸