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 UI Autocomplete 1.8.16 中文输入修正代码
Apr 16 Javascript
利用函数的惰性载入提高javascript代码执行效率
May 05 Javascript
js在指定位置增加节点函数insertBefore()用法实例
Jan 12 Javascript
jquery利用命名空间移除绑定事件的方法
Mar 11 Javascript
javascript中错误使用var造成undefined
Mar 31 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
Jun 07 Javascript
js日期相关函数dateAdd,dateDiff,dateFormat等介绍
Sep 24 Javascript
解析jquery easyui tree异步加载子节点问题
Mar 08 Javascript
React Router V4使用指南(精讲)
Sep 17 Javascript
JavaScript实现五子棋游戏的方法详解
Jul 08 Javascript
Vue+iview+webpack ie浏览器兼容简单处理
Sep 20 Javascript
layui实现多图片上传并限制上传的图片数量
Sep 26 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获取本周星期一具体日期的方法
2015/04/20 PHP
php正则去除网页中所有的html,js,css,注释的实现方法
2016/11/03 PHP
PHP实现超简单的SSL加密解密、验证及签名的方法示例
2017/08/28 PHP
JavaScript Event学习第九章 鼠标事件
2010/02/08 Javascript
jquery异步调用页面后台方法‏(asp.net)
2011/03/01 Javascript
在IE 浏览器中使用 jquery的fadeIn() 效果 英文字符字体加粗
2011/06/02 Javascript
SOSO地图API使用(一)在地图上画圆实现思路与代码
2013/01/15 Javascript
jQuery让控件左右移动的三种实现方法
2013/09/08 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
浏览器兼容性问题大汇总
2015/12/17 Javascript
JS定义类的六种方式详解
2016/05/12 Javascript
Bootstrap3.0学习教程之JS折叠插件
2016/05/27 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
Ionic3 UI组件之Gallery Modal详解
2017/06/07 Javascript
Vue中如何实现proxy代理
2018/04/20 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
JavaScript使用递归和循环实现阶乘的实例代码
2018/08/28 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
Python版的文曲星猜数字游戏代码
2013/09/02 Python
Python中bisect的用法
2014/09/23 Python
Python类的继承和多态代码详解
2017/12/27 Python
python flask 如何修改默认端口号的方法步骤
2019/07/12 Python
python自动点赞功能的实现思路
2020/02/26 Python
Python+pyftpdlib实现局域网文件互传
2020/08/24 Python
CSS3 对过渡(transition)进行调速以及延时
2020/10/21 HTML / CSS
俄罗斯厨房产品购物网站:COOK HOUSE
2021/03/15 全球购物
介绍一下gcc特性
2012/01/20 面试题
新学期校长寄语
2014/01/18 职场文书
舞蹈专业大学生职业规划范文
2014/03/12 职场文书
董事长秘书工作职责
2014/06/10 职场文书
护士实习求职信
2014/06/22 职场文书
孝敬父母的活动方案
2014/08/31 职场文书
幼儿园老师个人总结
2015/02/28 职场文书
JavaScript 去重和重复次数统计
2021/03/31 Javascript
MySQL如何解决幻读问题
2021/08/07 MySQL
Python Pandas数据分析之iloc和loc的用法详解
2021/11/11 Python