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跨域的4种方法和原理详解
Apr 08 Javascript
Javascript监视变量变化的方法
Jun 09 Javascript
JS作用域深度解析
Dec 29 Javascript
Node.js查找当前目录下文件夹实例代码
Mar 07 Javascript
vue.js简单配置axios的方法详解
Dec 13 Javascript
Node.js连接Sql Server 2008及数据层封装详解
Aug 27 Javascript
基于Webpack4和React hooks搭建项目的方法
Feb 05 Javascript
基于JS实现web端录音与播放功能
Apr 17 Javascript
中高级前端必须了解的JS中的内存管理(推荐)
Jul 04 Javascript
Vue登录拦截 登录后继续跳转指定页面的操作
Aug 04 Javascript
js 实现碰撞检测的示例
Oct 28 Javascript
SpringBoot在yml配置文件中配置druid的操作
Nov 16 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
thinkphp的c方法使用示例
2014/02/24 PHP
Laravel 框架返回状态拦截代码
2019/10/18 PHP
通过DOM脚本去设置样式信息
2010/09/19 Javascript
jQuery 1.7.2中getAll方法的疑惑分析
2012/05/23 Javascript
JQuery的read函数与js的onload不同方式实现
2013/03/18 Javascript
js导航菜单(自写)简单大方
2013/03/28 Javascript
js触发onchange事件的方法说明
2014/03/08 Javascript
javascript模拟评分控件实现方法
2015/05/13 Javascript
Nodejs中session的简单使用及通过session实现身份验证的方法
2016/02/04 NodeJs
jQuery如何解决IE输入框不能输入的问题
2016/10/08 Javascript
微信小程序 常用工具类详解及实例
2017/02/15 Javascript
ionic2中使用自动生成器的方法
2018/03/04 Javascript
jQuery中可见性过滤器简单用法示例
2018/03/31 jQuery
自定义vue组件发布到npm的方法
2018/05/09 Javascript
nodejs实现一个word文档解析器思路详解
2018/08/14 NodeJs
vue 插件的方法代码详解
2019/06/06 Javascript
小程序实现背景音乐播放和暂停
2020/06/19 Javascript
python实现微信远程控制电脑
2018/02/22 Python
Ubuntu下使用Python实现游戏制作中的切分图片功能
2018/03/30 Python
python自动重试第三方包retrying模块的方法
2018/04/24 Python
解决pycharm无法调用pip安装的包问题
2018/05/18 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
Pyecharts 动态地图 geo()和map()的安装与用法详解
2020/03/25 Python
Pytorch 使用不同版本的cuda的方法步骤
2020/04/02 Python
python简单实现9宫格图片实例
2020/09/03 Python
CSS3中的Media Queries学习笔记
2016/05/23 HTML / CSS
Visual-Click葡萄牙:欧洲领先的在线眼镜商
2020/02/17 全球购物
怎样从/向数据文件读/写结构
2014/11/23 面试题
安全标语口号
2014/06/09 职场文书
派出所正风肃纪剖析材料
2014/10/10 职场文书
医生学习党的群众路线教育实践活动心得体会
2014/11/03 职场文书
民事起诉状范文
2015/05/19 职场文书
地心历险记观后感
2015/06/15 职场文书
python数据库批量插入数据的实现(executemany的使用)
2021/04/30 Python
Nginx缓存设置案例详解
2021/09/15 Servers
Oracle表空间与权限的深入讲解
2021/11/17 Oracle