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 firefox不显示本地预览图片问题的解决方法
Nov 12 Javascript
用jquery实现等比例缩放图片效果插件
Jul 24 Javascript
JQuery+EasyUI轻松实现步骤条效果
Feb 22 Javascript
AngularJS控制器之间的数据共享及通信详解
Aug 01 Javascript
JS使用正则表达式过滤多个词语并替换为相同长度星号的方法
Aug 03 Javascript
jQuery事件详解
Feb 23 Javascript
vue2笔记 — vue-router路由懒加载的实现
Mar 03 Javascript
js评分组件使用详解
Jun 06 Javascript
微信小程序使用map组件实现路线规划功能示例
Jan 22 Javascript
JS中使用react-tooltip插件实现鼠标悬浮显示框
May 15 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
Dec 10 Javascript
了不起的11个JavaScript代码重构最佳实践小结
Jan 11 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/04/06 PHP
php 邮件发送问题解决
2014/03/22 PHP
smarty模板中使用get、post、request、cookies、session变量的方法
2014/04/24 PHP
laravel validate 设置为中文的例子(验证提示为中文)
2019/09/29 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
js 如何实现对数据库的增删改查
2012/11/23 Javascript
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
Javascript基础教程之if条件语句
2015/01/18 Javascript
原生javascript+css3编写的3D魔方动画旋扭特效
2016/03/14 Javascript
jQuery 利用$.ajax 时获取原生XMLHttpRequest 对象的方法
2016/08/25 Javascript
利用Vue.js指令实现全选功能
2016/09/08 Javascript
浅谈jQuery效果函数
2016/09/16 Javascript
JavaScript设置名字输入不合法的实现方法
2017/05/23 Javascript
Angular4 ElementRef的应用
2018/02/26 Javascript
Vue 应用中结合vux使用微信 jssdk的方法
2018/08/28 Javascript
微信小程序文章详情页面实现代码
2018/09/10 Javascript
基于Vue-cli快速搭建项目的完整步骤
2018/11/03 Javascript
js中的深浅拷贝问题简析
2019/05/10 Javascript
vue项目出现页面空白的解决方案
2019/10/31 Javascript
[00:53]TI3正赛第三天 DK怒破A队不败金身 现场国旗飘扬热血激昂
2013/08/10 DOTA
[58:57]2018DOTA2亚洲邀请赛3月29日小组赛B组 Effect VS VGJ.T
2018/03/30 DOTA
[01:18]PWL开团时刻DAY4——圣剑与抢盾
2020/11/03 DOTA
python采用getopt解析命令行输入参数实例
2014/09/30 Python
Python第三方Window模块文件的几种安装方法
2018/11/22 Python
Python http接口自动化测试框架实现方法示例
2018/12/06 Python
Python udp网络程序实现发送、接收数据功能示例
2019/12/09 Python
关于Keras Dense层整理
2020/05/21 Python
Django实现微信小程序支付的示例代码
2020/09/03 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
华为旗下电子商务平台:华为商城
2016/08/06 全球购物
Free People中国官网:波西米亚风格女装服饰
2016/08/30 全球购物
Kaufmann Mercantile官网:家居装饰、配件、户外及更多
2018/09/28 全球购物
旅游管理本科生求职信
2013/10/14 职场文书
房地产活动策划方案
2014/05/14 职场文书
网站出售协议书范文
2014/10/10 职场文书