如何用Koa Router处理GET请求中数量不确定的路由参数?
Koa Router 处理可变数量后续参数的方案
先看你原本的路由定义:
router.get('/:name/:age', async (ctx, next) => { ctx.body = ctx.params })
当访问 http://localhost:3000/vortesnail/18 时,能拿到参数:
{ name: 'vortesnail', age: '18' }
如果要处理后续参数数量不确定的URL(比如http://localhost:3000/vortesnail/18/male、http://localhost:3000/vortesnail/18/female/student/any/any这类),可以用Koa Router的通配符参数来实现,具体有两种写法:
方法一:匿名通配符匹配
把路由路径改成 /:name/:age/*,* 会匹配 name 和 age 之后的所有路径段,然后通过 ctx.params[0] 获取这些路径段组成的字符串,再分割成数组即可:
router.get('/:name/:age/*', async (ctx, next) => { // 分割剩余路径段,过滤空值(避免无额外参数时出现空字符串) const extraParams = ctx.params[0].split('/').filter(item => item); ctx.body = { name: ctx.params.name, age: ctx.params.age, extra: extraParams }; });
比如访问 http://localhost:3000/vortesnail/18/male/student,返回结果是:
{ "name": "vortesnail", "age": "18", "extra": ["male", "student"] }
方法二:命名通配符匹配
给通配符指定一个名字(比如extra),路由路径写成 /:name/:age/:extra*,这样可以通过 ctx.params.extra 拿到剩余路径段的字符串,处理逻辑和上面一致:
router.get('/:name/:age/:extra*', async (ctx, next) => { const extraParams = ctx.params.extra.split('/').filter(item => item); ctx.body = { name: ctx.params.name, age: ctx.params.age, extra: extraParams }; });
这种写法可读性更强,能直观知道这个通配符对应的是额外参数。
如果访问没有后续参数的URL(比如原路径http://localhost:3000/vortesnail/18),extra 会是一个空数组,不会影响正常返回。
内容的提问来源于stack exchange,提问作者vortesnail
相关产品推荐
相关产品推荐

