fiber路由不支持内置正则参数匹配,仅支持静态路径和:param通配符;参数校验需手动在handler或中间件中用预编译正则实现,多参数场景推荐结构体绑定+validator库校验。

Fiber 路由参数不支持内置正则匹配
Fiber 的 Get、Post 等路由方法本身**不提供类似 Flask 的 <user_id></user_id> 或 Express 的 /user/:id(\d+) 这类正则参数语法**。它的路径匹配基于快速前缀树(Trie),只支持静态路径和通配符 :param(即捕获任意非斜杠字符串),不做格式校验。
必须手动在 Handler 中校验 :param 值
所有参数都以字符串形式进入 c.Params(),校验逻辑得自己写。常见做法是用 regexp.MustCompile 预编译正则,再在 handler 里调用 MatchString:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
var phoneRE = regexp.MustCompile(`^1[3-9]d{9}$`)
app.Get("/user/:phone", func(c *fiber.Ctx) error {
phone := c.Params("phone")
if !phoneRE.MatchString(phone) {
return c.Status(fiber.StatusBadRequest).SendString("手机号格式错误")
}
return c.SendString("OK")
})
- 别在每次请求里调用
regexp.Compile,性能差;必须提前MustCompile或Compile后复用 -
c.Params("phone")返回空字符串时不会 panic,但需额外判空(比如/user/会捕获到空串) - 如果多个路由共用同一校验逻辑,建议封装成中间件,用
c.Next()控制流程
用中间件统一处理参数校验更可靠
把校验逻辑抽成中间件,能避免重复代码,也方便统一返回格式(比如 JSON 错误响应):
func ValidatePhone(next fiber.Handler) fiber.Handler {
return func(c *fiber.Ctx) error {
phone := c.Params("phone")
if phone == "" || !phoneRE.MatchString(phone) {
return c.Status(fiber.StatusBadRequest).JSON(fiber.Map{
"error": "无效手机号",
})
}
return next(c)
}
}
app.Get("/api/bind/:phone", ValidatePhone, handleBind)
- 中间件注册顺序很重要:必须放在路由 handler 之前,否则校验不生效
- 注意不要在中间件里调用
c.Send或c.JSON后还执行next(c),会导致 “multiple response.WriteHeader calls” 错误 - 若需校验多个参数(如
:id+:token),中间件里要逐个检查,任一失败就提前返回
复杂场景建议用结构体绑定 + 自定义验证器
当参数多、规则杂(比如同时校验手机号 + 时间戳 + 枚举值),硬写正则易出错。推荐用 c.Params 提取后,转成结构体,再用 validator 库做字段级校验:
type BindReq struct {
Phone string `validate:"required,len=11,regex=^1[3-9]\d{9}$"`
Token string `validate:"required,min=32"`
}
app.Post("/api/bind", func(c *fiber.Ctx) error {
req := new(BindReq)
req.Phone = c.Params("phone")
req.Token = c.Params("token")
if err := validator.New().Struct(req); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(err.Error())
}
return c.SendString("绑定成功")
})
- 正则里的反斜杠要双写(
\d),否则 Go 字符串解析会出错 - 这种写法比纯正则更易维护,错误信息也更明确
- 注意
validator默认不校验空字符串,required标签必须显式加
next,还有结构体字段标签里的反斜杠逃逸。










