beego.Router 不能定义命名空间,必须用 beego.NSNamespace 创建并调用 beego.AddNamespace 在 init() 中注册;命名空间支持嵌套、Filter 作用域隔离及路径前缀拼接,不改变控制器方法映射规则。

beego.Router 不能直接定义命名空间
命名空间不是靠单个 beego.Router 调用实现的,必须用 beego.NSNamespace 显式创建并注册。直接在 Router 里写 /admin/xxx 只是普通前缀路由,不带命名空间语义(比如无法统一挂 Filter、无法嵌套、不能被 beego.GetNamespace 查找)。
如何正确注册命名空间:init() 中调用 beego.AddNamespace
命名空间对象必须通过 beego.AddNamespace 注册才生效,且只能在 routers/router.go 的 init() 函数中做。常见错误是漏掉这一步,或放在其他函数里 —— 此时路由完全不生效,也不报错。
-
beego.NSNamespace返回一个命名空间对象,需传入路径前缀(如"/api/v1") - 链式调用
Filter、Router、NSNamespace添加子空间 - 最后必须用
beego.AddNamespace(ns)注册,否则整个结构被忽略
示例:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
func init() {
v1 := beego.NSNamespace("/api/v1",
beego.NSRouter("/users", &controllers.UserController{}),
beego.NSRouter("/posts", &controllers.PostController{}),
beego.NSFilter("*", beego.BeeLogger.Info, "before"),
)
beego.AddNamespace(v1) // 这行不能少
}
命名空间嵌套与 Filter 作用域
子命名空间的 Filter 默认只对自身路径生效,不会自动继承父级 Filter。如果需要全局前置逻辑(如 JWT 验证),要么在每个子空间重复加 NSFilter,要么把 Filter 加在最外层命名空间上。
- 嵌套写法:
beego.NSNamespace("/admin", ...).NSNamespace("/sys", ...) -
NSFilter的"*"表示所有方法,但只匹配当前命名空间下的路由 - 若子空间用了
NSRouter("/xxx", ...),其内部控制器的Prepare()仍会执行,但和 NSFilter 是两套机制,别混用
命名空间下 RESTful 路由的 method 映射规则不变
在命名空间内用 NSRouter("/users", &controllers.UserController{}),和全局用 beego.Router("/api/v1/users", &controllers.UserController{}) 效果一致:GET 请求仍调 UserController.Get,POST 仍调 Post。命名空间不改变控制器方法绑定逻辑,只提供路径分组和中间件隔离能力。
容易忽略的一点:命名空间路径本身也参与匹配,所以 NSNamespace("/api") + NSRouter("/v1/users", ...) 实际对应完整路径 /api/v1/users,不是 /v1/users —— 前缀拼接是隐式的,别多写一遍。


















