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💡 它支持
get、post、put、patch、del、head、options全部 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匹配1或abc@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.params | req.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.js | getParamsAndQuery:req.params与req.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),仅供参考