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 相关文章推荐
node.js中的http.response.write方法使用说明
Dec 14 Javascript
jQuery旋转木马式幻灯片轮播特效
Dec 04 Javascript
实例讲解js验证表单项是否为空的方法
Jan 09 Javascript
JS数组搜索之折半搜索实现方法分析
Mar 27 Javascript
简单实现js上传文件功能
Aug 21 Javascript
jquery鼠标悬停导航下划线滑出效果
Sep 29 jQuery
js判断节假日实例代码
Dec 27 Javascript
JavaScript门道之标准库
May 26 Javascript
Vue props用法详解(小结)
Jul 03 Javascript
这15个Vue指令,让你的项目开发爽到爆
Oct 11 Javascript
用webAPI实现图片放大镜效果
Nov 23 Javascript
解决vue使用vant轮播组件swipe + flex时文字抖动问题
Jan 07 Vue.js
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
DC《神奇女侠2》因疫情推迟上映 温子仁新恐怖片《恶性》撤档
2020/04/09 欧美动漫
在普通HTTP上安全地传输密码
2007/07/21 PHP
php的ajax框架xajax入门与试用介绍
2010/12/19 PHP
php自动注册登录验证机制实现代码
2011/12/20 PHP
PHP串行化与反串行化实例分析
2016/12/27 PHP
Laravel 加载第三方类库的方法
2018/04/20 PHP
Yii使用DbTarget实现日志功能的示例代码
2020/07/21 PHP
基于jQuery的弹出警告对话框美化插件(警告,确认和提示)
2010/06/10 Javascript
jquery json 实例代码
2010/12/02 Javascript
javascript消除window.close()的提示窗口
2015/05/20 Javascript
javascript实现html页面之间参数传递的四种方法实例分析
2015/12/15 Javascript
基于JS实现导航条flash导航条
2016/06/17 Javascript
微信小程序 在Chrome浏览器上运行以及WebStorm的使用
2016/09/27 Javascript
详解jQuery选择器
2016/12/21 Javascript
docker中编译nodejs并使用nginx启动
2017/06/23 NodeJs
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
node+koa实现数据mock接口的方法
2017/09/20 Javascript
Gulp实现静态网页模块化的方法详解
2018/01/09 Javascript
详解webpack-dev-server使用方法
2018/09/14 Javascript
wxPython的安装图文教程(Windows)
2017/12/28 Python
Python设计模式之MVC模式简单示例
2018/01/10 Python
TensorFlow用expand_dim()来增加维度的方法
2018/07/26 Python
Pycharm代码无法复制,无法选中删除,无法编辑的解决方法
2018/10/22 Python
使用python将请求的requests headers参数格式化方法
2019/01/02 Python
python实现微信定时每天和女友发送消息
2019/04/29 Python
python算法题 链表反转详解
2019/07/02 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
python GUI库图形界面开发之PyQt5控件QTableWidget详细使用方法与属性
2020/02/25 Python
jupyter notebook oepncv 显示一张图像的实现
2020/04/24 Python
完美解决python针对hdfs上传和下载的问题
2020/06/05 Python
Python 处理日期时间的Arrow库使用
2020/08/18 Python
安踏官方商城:anta.cn
2019/12/16 全球购物
MIXIT官网:俄罗斯最大的化妆品公司之一
2020/01/25 全球购物
学生实习推荐信范文
2013/11/26 职场文书
Python3.10的一些新特性原理分析
2021/09/15 Python
WinServer2012搭建DNS服务器的方法步骤
2022/06/10 Servers