优先选beego.RESTRouter实现RESTful资源操作,要求Controller定义Get/Post等标准方法;非标准接口或页面跳转用beego.Router并显式映射方法,如"get:Login;post:DoLogin"。

beego.Router 与 beego.RESTRouter 怎么选
路由注册是 Beego 开发的第一步,但新手常卡在 beego.Router 和 beego.RESTRouter 的选择上。前者是通用路由,后者专为 RESTful 风格设计,自动按 HTTP 方法映射到 Controller 的不同方法(如 Get、Post、Patch)。如果你的接口明确分资源操作(比如 /api/users 对应增删改查),直接用 beego.RESTRouter 更省事;如果只是简单页面跳转或非标准接口,beego.Router 更灵活。
常见错误:混用两种方式注册同一路径,导致行为不可预测;或者没在 Controller 中定义对应方法(比如用了 RESTRouter 却只写了 Get,没写 Post),结果 POST 请求 405。
-
beego.Router("/login", &controllers.LoginController{}, "get:Login;post:DoLogin")是显式指定方法映射,适合非标准命名 -
beego.RESTRouter("/api/posts", &controllers.PostController{})要求 Controller 必须有Get()、Post()等方法,且不能少 - 所有路由注册必须在
routers/router.go的init()函数里完成,否则启动时不会加载
c.Data 与 c.TplName 渲染模板时的坑
Beego 模板渲染靠两个核心字段:c.Data 传数据,c.TplName 指定文件名。但很多人写完发现页面空白或报错 template: index.tpl:1:1: no such template "index.tpl",根本原因是路径和扩展名没对上。
默认模板目录是 views/,但 Beego 只认 .tpl、.html、.gohtml 三种后缀。如果你新建了 index.html,却写 c.TplName = "index.html",它能工作;但若写成 c.TplName = "views/index.html" 就会失败——TplName 是相对 views/ 的路径,不带目录前缀。
- 模板文件必须放在
views/目录下,子目录可以,比如views/admin/dashboard.tpl→c.TplName = "admin/dashboard.tpl" -
c.Data是 map[string]interface{},键名区分大小写,模板里写{{.Title}}就得用c.Data["Title"] = "xxx",写成c.Data["title"]就取不到 - 如果模板中用了
{{.User.Name}},确保传入的是结构体指针或完整结构体,不是 nil 或 map
beego.ORM 初始化失败的典型原因
Beego ORM 不是开箱即用的,必须手动注册驱动、建模、执行 orm.RunSyncdb。最常见的初始化失败报错是 register db `default` not found 或 invalid memory address or nil pointer dereference,基本都出在配置和调用时机上。
关键点在于:ORM 初始化代码必须在 main.go 的 beego.Run() 之前执行,且数据库配置(如 mysql 连接串)必须已在 conf/app.conf 中正确设置,并通过 beego.AppConfig.String("db::dsn") 读取。别在 Controller 里 init ORM,那是 runtime 阶段,太晚了。
- 在
models/models.go中 import"github.com/beego/beego/v2/client/orm"和对应驱动(如_ "github.com/go-sql-driver/mysql") - 在
models/init.go(或main.go开头)调用orm.RegisterDriver("mysql", orm.DRMySQL)和orm.RegisterDataBase("default", "mysql", dsn) - 再调用
orm.RegisterModel(new(User))注册模型,最后orm.RunSyncdb("default", false, true)同步表结构 - 如果用
bee run启动,确保conf/app.conf里db::dsn = "root:pass@tcp(127.0.0.1:3306)/test?charset=utf8"格式正确,且数据库已存在
bee run 热重载不生效怎么办
bee run 的热重载依赖文件系统事件监听,但它默认只监视 .go 文件,且对某些 IDE(如 VS Code)的保存行为或远程开发环境(WSL、Docker)不敏感。你改了 controllers/xxx.go,控制台没反应,服务也没重启,大概率是这个原因。
解决方法不是换工具,而是确认三件事:当前工作目录是否为项目根目录(bee run 必须在含 go.mod 和 conf/app.conf 的目录下执行);bee 版本是否匹配 Beego v2(老版本 bee 不支持 v2 模块路径);以及有没有启用 watch 模式(bee run -d=false 是关闭调试,不是关热重载)。
- 运行
bee run -v查看详细日志,确认是否打印Start building...和Restarting... - 修改
conf/app.conf中的watchall = true,可让 bee 监听.tpl、.conf等非 Go 文件 - 在 WSL 中遇到问题,试试
bee run --watchdir="/mnt/c/..."显式指定路径,避免 Windows 文件系统事件丢失 - 如果仍不行,临时用
go run main.go+ 手动Ctrl+C+↑回车替代,至少保证开发流不中断
beego.Run(),路由必须在 init() 里注册,模板路径不带 views/ 前缀,而 bee run 的热重载默认不扫配置和模板文件——这些不是 bug,是设计约束。


















