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中add实现同时选择两个id对象
Oct 22 Javascript
DIV+CSS+JS不间断横向滚动实现代码
Mar 19 Javascript
Firefox中通过JavaScript复制数据到剪贴板(Copy to Clipboard 跨浏览器版)
Nov 22 Javascript
深入探寻javascript定时器
Jan 02 Javascript
JS原型、原型链深入理解
Feb 27 Javascript
基于 Bootstrap Datetimepicker 联动
Aug 03 Javascript
集成vue到jquery/bootstrap项目的方法
Feb 10 jQuery
轻量级富文本编辑器wangEditor结合vue使用方法示例
Oct 10 Javascript
vue中的适配px2rem示例代码
Nov 19 Javascript
详解js动态获取浏览器或页面等容器的宽高
Mar 13 Javascript
详解微信小程序调用支付接口支付
Apr 28 Javascript
React优化子组件render的使用
May 12 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目录操作函数之获取目录与文件的类型
2010/12/29 PHP
解析php中call_user_func_array的作用
2013/06/07 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
详解Yaf框架PHPUnit集成测试方法
2017/12/27 PHP
JavaScript去除空格的几种方法
2006/10/03 Javascript
用Div仿showModalDialog模式菜单的效果的代码
2007/03/05 Javascript
JS之小练习代码
2008/10/12 Javascript
js调试工具 Javascript Debug Toolkit 2.0.0版本发布
2008/12/02 Javascript
Mootools 1.2教程 事件处理
2009/09/15 Javascript
js判断游览器类型及版本号的代码
2014/05/11 Javascript
jQuery EasyUi实战教程之布局篇
2016/01/26 Javascript
Bootstrap入门书籍之(一)排版
2016/02/17 Javascript
AngularJS中一般函数参数传递用法分析
2016/11/22 Javascript
在vue中使用Autoprefixed的方法
2018/07/27 Javascript
vue 详情跳转至列表页实现列表页缓存
2019/03/27 Javascript
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
vue中的循环对象属性和属性值用法
2020/09/04 Javascript
Python中字典的基础知识归纳小结
2015/08/19 Python
举例讲解Python编程中对线程锁的使用
2016/07/12 Python
pycharm中连接mysql数据库的步骤详解
2017/05/02 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
python实现黑客字幕雨效果
2018/06/21 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
商场端午节活动方案
2014/01/29 职场文书
2014年幼儿园元旦活动方案
2014/02/13 职场文书
21岁生日感言
2014/02/27 职场文书
大二法英学生职业生涯规划范文
2014/02/27 职场文书
精彩的演讲稿开头
2014/05/08 职场文书
法律专业求职信
2014/05/24 职场文书
假面舞会策划方案
2014/05/29 职场文书
社区志愿者活动总结
2014/06/26 职场文书
食品科学与工程专业毕业生求职信范文
2014/07/21 职场文书
重点工程汇报材料
2014/08/27 职场文书
任命书怎么写
2015/03/02 职场文书
美容院员工规章制度
2015/08/05 职场文书
Golang中异常处理机制详解
2021/06/08 Golang