beego.run() 启动服务时依次加载配置、初始化日志、触发 routers/init() 注册路由、编译模板、开启 session(若配置)、最后监听端口;任一环节失败(如 app.conf 缺失或格式错误)将静默退出或 panic。

Beego 项目不是靠“猜结构”跑起来的,而是靠 main.go 显式调用 beego.Run() 启动,并依赖 routers 包的 init() 函数注册路由——没这一步,所有控制器和视图都只是死文件。
beego.Run() 是怎么启动服务的
beego.Run() 不是简单起个 HTTP server,它会按顺序做几件事:加载 conf/app.conf、初始化日志、注册路由(靠 _ "myproject/routers" 触发)、编译模板、开启 session(如果配置了)、最后才监听端口。任何一步失败都会静默退出或 panic,比如 app.conf 缺失或格式错误,bee run 可能只报 exit status 1 而不提示具体原因。
常见错误现象:
- 浏览器访问
http://localhost:8080显示连接被拒绝 →main.go里漏了beego.Run()或拼错成beego.Runn() - 控制台无报错但服务未启动 → 检查
conf/app.conf是否存在,且第一行不能是空行或 BOM 头 - 路由 404 却没进控制器 → 确认
routers/router.go是否被main.go导入,且导入语句用了下划线:_ "myproject/routers"
routers/router.go 的 init() 必须被触发
Beego 的路由注册不靠显式调用,而靠 init() 函数自动执行。如果你把路由写在 controllers/default.go 里,beego.Router() 永远不会被调用——因为 Go 不会主动执行未被引用包的 init()。
正确做法:
- 新建
routers/router.go,包名设为routers - 在
init()里调用beego.Router()、beego.AutoRouter()或beego.RESTRouter() -
main.go中必须有_ "myproject/routers"这行导入(注意下划线) - 别把路由逻辑写在
controllers或models里,它们不参与初始化链路
示例 routers/router.go 片段:
package routers
import (
"myproject/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{})
}
controllers 目录下 controller 结构要符合 Beego 约定
Beego 控制器不是普通 struct,必须嵌入 beego.Controller,否则无法使用 this.Data、this.TplName、this.ServeJSON() 等方法。
容易踩的坑:
- 忘记继承:
type MainController struct { }❌ → 正确是type MainController struct { beego.Controller } - 方法名首字母小写:
func (c *MainController) get() {}不会被路由识别,必须是Get()、Post()等大写开头方法 - 没设置
TplName就调this.TplName = "index.tpl",模板路径默认从views/开始找,不要加前缀views/ - 返回 JSON 时忘了设 Content-Type:
this.ServeJSON()会自动处理,但手动this.Ctx.Output.JSON()需自己设this.Ctx.Output.SetStatus(200)
conf/app.conf 的配置项影响实际行为
app.conf 不只是改端口那么简单。几个关键配置项直接决定框架是否按预期工作:
-
runmode = dev:启用热编译、显示详细错误页;设为prod后错误变空白页,调试信息全丢 -
httpport = 8080:端口值必须是数字,写成"8080"(带引号)会导致启动失败且无提示 -
autorender = true:决定是否自动渲染模板;设为false后this.TplName不生效,需手动this.Ctx.Output.Body() -
copyrequestbody = true:不开启的话,this.Ctx.Input.RequestBody为空,this.GetString()也取不到 POST 表单数据
最常被忽略的是 copyrequestbody —— 它默认是 false,而很多新手以为 POST 数据天然可读,结果卡在参数解析环节半天。











