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 相关文章推荐
Extjs EditorGridPanel中ComboBox列的显示问题
Jul 04 Javascript
不使用浏览器运行javascript代码的方法
Jul 24 Javascript
JS获取IP、MAC和主机名的五种方法
Nov 14 Javascript
Jquery焦点与失去焦点示例应用
Jun 10 Javascript
如何在MVC应用程序中使用Jquery
Nov 17 Javascript
纯jquery实现模仿淘宝购物车结算
Aug 20 Javascript
jQuery正则验证注册页面经典实例
Jun 10 jQuery
JS实现十字坐标跟随鼠标效果
Dec 25 Javascript
js判断非127开头的IP地址的实例代码
Jan 05 Javascript
关于vue-cli3打包代码后白屏的解决方案
Sep 02 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
Nov 17 Vue.js
JavaScript实现打字游戏
Feb 19 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/03/24 PHP
thinkphp数据查询和遍历数组实例
2014/11/28 PHP
php使用wordwrap格式化文本段落的方法
2015/03/17 PHP
PHP实现的ID混淆算法类与用法示例
2018/08/10 PHP
HTML中事件触发列表与解说
2007/07/09 Javascript
js实现iframe动态调整高度的代码
2008/01/06 Javascript
使用jQuery简化Ajax开发 Ajax开发入门
2009/10/14 Javascript
extjs render 用法介绍
2013/09/11 Javascript
javascript使用prototype完成单继承
2014/12/24 Javascript
javascript浏览器窗口之间传递数据的方法
2015/01/20 Javascript
jQuery如何使用自动触发事件trigger
2015/11/29 Javascript
基于Javascript实现倒计时功能
2016/02/22 Javascript
Jquery $when done then的用法详解
2016/05/20 Javascript
js canvas实现擦除动画
2016/07/16 Javascript
JS设置时间无效问题的解决办法
2017/02/18 Javascript
详解express与koa中间件模式对比
2017/08/07 Javascript
angular6根据environments配置文件更改开发所需要的环境的方法
2019/03/06 Javascript
关于vue 项目中浏览器跨域的配置问题
2020/11/10 Javascript
Python开发之快速搭建自动回复微信公众号功能
2016/04/22 Python
python 捕获 shell/bash 脚本的输出结果实例
2017/01/04 Python
使用Python实现博客上进行自动翻页
2017/08/23 Python
Python实现的求解最大公约数算法示例
2018/05/03 Python
Python之批量创建文件的实例讲解
2018/05/10 Python
Python两个字典键同值相加的几种方法
2019/03/05 Python
对Python 简单串口收发GUI界面的实例详解
2019/06/12 Python
对python中的float除法和整除法的实例详解
2019/07/20 Python
浅谈Keras中shuffle和validation_split的顺序
2020/06/19 Python
python中random.randint和random.randrange的区别详解
2020/09/20 Python
python如何调用百度识图api
2020/09/29 Python
英国皇家邮政海外旗舰店:Royal Mail
2018/02/21 全球购物
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
如何开发一个JQuery插件
2016/07/28 面试题
应届生自荐信
2014/06/30 职场文书
纪念九一八事变83周年国旗下讲话稿
2014/09/15 职场文书
英文自荐信范文
2015/03/25 职场文书
MySQL的表级锁,行级锁,排它锁和共享锁
2022/07/15 MySQL