beego路由必须在beego.run()前注册,否则失效;路由顺序影响匹配结果,需先写具体路径再写泛路径;restful方法名须严格匹配且首字母大写;参数需手动提取,不支持签名注入。

Beego 路由不能“运行时添加”,所有 beego.Router() 必须在 beego.Run() 之前执行,否则直接失效——这是绝大多数 404/405 的根源。
路由注册必须写在 main() 函数里,且在 beego.Run() 前
Beego 的路由树在 beego.Run() 启动时就一次性构建完成,之后再调用 beego.Router() 完全被忽略。
- ✅ 正确位置:只放在
main.go的func main()中,且位于beego.Run()调用之前 - ❌ 错误做法:写在控制器方法里、中间件中、
init()函数里,或拆到子包的init()中(执行顺序不可控) - ⚠️ 常见现象:代码里明明写了
beego.Router("/api/user", &controllers.UserController{}, "get:Get"),但访问返回 404;查日志发现该行被包裹在if debugMode { ... }里,而条件未满足
RESTful 路由要严格匹配方法名和大小写
"get:Get" 不是靠反射自动找 Get(),而是字符串精确匹配控制器里定义的方法名。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 方法名必须首字母大写,且与路由字符串中冒号后完全一致:
GetById✅,getbyid❌,getById❌ - 参数不通过函数签名注入,全靠
c.Ctx.Input.Param(":id")手动取;不要写func (c *UserController) GetById(id string),Beego 不支持 - 路径类型约束如
:id:int只影响 URL 解析,不校验控制器方法是否接收该参数
用 beego.Get()/beego.Post() 快速挂匿名函数
适合原型验证或简单接口,绕过控制器定义,省去文件拆分成本。
beego.Get("/health", func(c *context.Context) { c.Output.Body([]byte("ok")) })beego.Post("/echo", func(c *context.Context) { c.ServeJSON(map[string]string{"msg": "received"}) })- 注意:这类函数无法使用
this.Data或模板渲染,仅适合纯 API 场景
别把 Beego 当网关用,代理逻辑得自己写
有人以为 beego.Router("/api/users", &ProxyController{}) 就能自动转发,其实只是绑了个空控制器——404 是必然结果。
- 若真要代理,必须在控制器方法里手写反向代理,例如用
httputil.NewSingleHostReverseProxy - 关键细节:
c.Ctx.Request.Body是单次读取流,需提前io.Copy(ioutil.Discard, c.Ctx.Request.Body)或用bytes.NewReader重建,否则下游收不到 body - Beego 没有连接池、健康检查、重试机制,高并发或生产级网关场景请换 Kong/Nginx
最易被忽略的一点:路由注册顺序会影响匹配结果。比如 beego.Router("/api/:id", ...) 写在 beego.Router("/api/users", ...) 前面,后者就永远匹配不到——Beego 是按注册顺序从上到下匹配的。










