2 个技巧玩转 micro-router 路由参数:req.params 与 req.query 解析完全指南
2026/8/26 14:59:23 网站建设 项目流程

2 个技巧玩转 micro-router 路由参数:req.params 与 req.query 解析完全指南

【免费下载链接】micro-router:station: A tiny and functional router for Zeit's Micro项目地址: https://gitcode.com/gh_mirrors/mi/micro-router

micro-router(npm 包名microrouter)是一个专为 ZEIT 的Micro框架打造的微型功能路由库——只用几行代码,就能以函数式风格定义 HTTP 路由,并原生支持async/await。这篇文章带你用2 个核心技巧,彻底玩转 micro-router 路由参数:用req.params提取 URL 路径参数、用req.query解析查询字符串,从此告别"参数到底在哪"的困惑 🔍

🚀 快速上手:1 行命令安装 micro-router

micro-router 的依赖极简,核心只用了url-pattern一个包来做路径匹配(见 package.json)。安装方式如下:

yarn add microrouter

如果你还想阅读或修改它的源码,可以克隆仓库到本地:

git clone https://gitcode.com/gh_mirrors/mi/micro-router

💡 它支持getpostputpatchdelheadoptions全部 7 种 HTTP 方法,每个路由就是一个(req, res) => {}的函数,简单直接。

技巧一:用 req.params 提取 URL 路径参数

路径参数是 RESTful API 的灵魂,比如/hello/:who中的:who。micro-router 使用:记法定义路径变量,请求命中后,这些变量会被自动收集成一个对象,挂在req.params上。

const { router, get } = require('microrouter') module.exports = router( get('/hello/:who', (req, res) => req.params) )

请求GET /hello/World时,req.params的值就是:

{ who: 'World' }

几个必须知道的细节

要点说明
变量命名支持字母、数字、-_(在 src/utils/index.js 的segmentNameCharset中定义)
变量取值支持字母、数字及@ . + - _等特殊字符,因此/user/:id匹配1abc@x.com都没问题
匹配引擎底层由url-pattern驱动,还支持用new UrlPattern(/正则/)做高级匹配

也就是说:你在路径里声明了几个:变量req.params里就有几个键,一一对应,非常可预测 🎯

技巧二:用 req.query 解析查询字符串

如果说req.params管的是"路径段",那req.query管的就是 URL 里?后面的部分。micro-router 会自动解析查询字符串,无需你手动处理:

module.exports = router( get('/user', (req, res) => req.query) )

请求GET /user?id=1时,req.query的值就是:

{ id: '1' }

查询参数不需要提前声明,URL 里带了什么,req.query里就有什么——这让"搜索、过滤、分页"这类动态参数变得特别轻松。

🧩 一张表搞懂:req.params vs req.query

对比项req.paramsreq.query
来源路径中的:变量URL 中?key=value部分
是否需声明✅ 必须在路径里用:定义❌ 动态读取,无需声明
典型场景资源 ID、路径层级(如/user/:id搜索条件、分页页码、筛选开关
请求示例/hello/World{ who: 'World' }/user?id=1{ id: '1' }
常见误解?who=x不会进入 params路径段World不会进入 query

记住这句话:路径归 params,问号归 query,两边互不串门✌️

⚡ 进阶玩法:参数组合与路由优先级

1. 同时使用两种参数

官方测试文件 src/lib/index.test.js 里就有一个经典组合案例:路由/hello/:msg收到请求/hello/world?time=now,处理函数可以同时拿到:

const hello = req => `Hello ${req.params.msg} ${req.query.time}` // 输出:Hello world now

一个请求里,路径参数负责定位"资源",查询参数负责附加"条件",各司其职。

2. 路由按顺序匹配,先命中先生效

router内部会按你传入的顺序依次尝试匹配(实现见 src/lib/index.js 中的findRoute),一旦某个处理函数返回了结果,后续路由就不再执行。所以建议把具体路由写在前面,通配路由/*放在最后作为兜底(如 404 处理)。

3. 别忘了:请求体需要手动解析

micro-router 本身不解析任何请求体,它只负责路径匹配。如果你要处理POST的 JSON body,搭配 Micro 自带的json辅助函数即可:

const body = await json(req)

4. 版本化 API 就用 withNamespace

当你的 API 需要多版本时,withNamespace高阶函数可以一键给一组路由加上前缀:

const oldApi = withNamespace('/api/v1') const newApi = withNamespace('/api/v2')

这样/api/v1/user/:id/api/v2/user/:id各管各的,req.params照常工作,管理起来清爽又省心 🗂️

📂 想看源码?核心文件都在这

文件作用
src/lib/index.js路由注册与分发,7 种 HTTP 方法都出自这里
src/utils/index.jsgetParamsAndQueryreq.paramsreq.query的解析核心
src/lib/index.test.js完整测试用例,是学习各种用法最好的"活文档"
readme.md官方使用文档,含 Namespaced Routes 等进阶章节

🎯 小结

  • req.params:路径:变量的集合,记得先声明再使用
  • req.query?后查询串的集合,随用随取
  • 两者互不干扰,可自由组合,覆盖 90% 的路由参数场景
  • 路由顺序即优先级,兜底路由放最后

micro-router 把"路由参数解析"这件容易踩坑的事,压缩成了两行代码的心智负担。下次写 Micro 服务时,直接把这篇指南收进你的工具箱吧 🛠️

【免费下载链接】micro-router:station: A tiny and functional router for Zeit's Micro项目地址: https://gitcode.com/gh_mirrors/mi/micro-router

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询