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 相关文章推荐
让焦点自动跳转
Jul 01 Javascript
node.js中的path.sep方法使用说明
Dec 08 Javascript
JSONObject使用方法详解
Dec 17 Javascript
jQuery实现TAB选项卡切换特效简单演示
Mar 04 Javascript
js canvas实现擦除动画
Jul 16 Javascript
jQuery控制控件文本的长度的操作方法
Dec 05 Javascript
jquery.uploadifive插件怎么解决上传限制图片或文件大小问题
May 08 jQuery
基于jQuery Easyui实现登陆框界面
Jul 10 jQuery
深入理解vue Render函数
Jul 19 Javascript
jQuery中ajax请求后台返回json数据并渲染HTML的方法
Aug 08 jQuery
vue 组件中使用 transition 和 transition-group实现过渡动画
Jul 09 Javascript
JavaScript实现页面动态验证码的实现示例
Mar 23 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的分页功能
2007/03/21 PHP
php中ob_get_length缓冲与获取缓冲长度实例
2014/11/20 PHP
PHP远程调试之XDEBUG
2015/12/29 PHP
基于php判断客户端类型
2016/10/14 PHP
JQuery SELECT单选模拟jQuery.select.js
2009/11/12 Javascript
Jquery+WebService 校验账号是否已被注册的代码
2010/07/12 Javascript
防止文件缓存的js代码
2013/01/10 Javascript
js函数中onmousedown和onclick的区别和联系探讨
2013/05/19 Javascript
深入探寻javascript定时器
2015/01/02 Javascript
JS解析XML文件和XML字符串详解
2015/04/17 Javascript
jQuery学习心得总结(必看篇)
2016/06/10 Javascript
JavaScript获取css行间样式,内连样式和外链样式的简单方法
2016/07/18 Javascript
Bootstrap整体框架之CSS12栅格系统
2016/12/15 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
使用smartupload组件实现jsp+jdbc上传下载文件实例解析
2017/01/05 Javascript
Vue 2.0学习笔记之使用$refs访问Vue中的DOM
2017/12/19 Javascript
浅谈Vue-cli单文件组件引入less,sass,css样式的不同方法
2018/03/13 Javascript
vue2.0模拟锚点的实例
2018/03/14 Javascript
在JavaScript中如何访问暂未存在的嵌套对象
2019/06/18 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
[00:48]DOTA2国际邀请赛公开赛报名开始 扫码开启逐梦之旅
2018/06/06 DOTA
[01:06]DOTA2小知识课堂 Ep.02 吹风竟可解梦境缠绕
2019/12/05 DOTA
python网络编程学习笔记(八):XML生成与解析(DOM、ElementTree)
2014/06/09 Python
python Django模板的使用方法
2016/01/14 Python
深入理解Python中变量赋值的问题
2017/01/12 Python
在Python程序员面试中被问的最多的10道题
2017/12/05 Python
python+selenium+chrome批量文件下载并自动创建文件夹实例
2020/04/27 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
英国女性化妆品收纳和家具网站:Beautify
2019/12/07 全球购物
网络安全类面试题
2015/08/01 面试题
酒店经理职责
2014/01/30 职场文书
会走路的树教学反思
2014/02/20 职场文书
大国崛起日本观后感
2015/06/02 职场文书
Python实现GIF动图以及视频卡通化详解
2021/12/06 Python
奥特曼十大神器:奥特手镯在榜,第一是贝利亚的神器
2022/03/18 日漫
python计算列表元素与乘积详情
2022/08/05 Python