buffalo启动报数据库连接失败,主因是go_env未导出或database_url为空;models.newdb()不解析database.yml,只认database_url或硬编码url;需用echo $go_env和echo $database_url验证,再通过buffalo task db:ping定位问题。

buffalo dev 启动就报数据库连接失败
这不是 PostgreSQL 没装好,而是 GO_ENV 没导出或 DATABASE_URL 为空。
-
echo $GO_ENV必须输出development;如果为空,立刻执行export GO_ENV=development -
echo $DATABASE_URL必须有值,比如postgres://postgres:pass@localhost:5432/myapp_development;为空就说明.env文件没被读取(Buffalo 不自动加载 .env) - 别信
config/database.yml—— Buffalo 的models.NewDB()根本不解析它,只认DATABASE_URL或硬编码 URL;打开models/models.go看pop.NewConnection构造时传的是什么 - 用
buffalo task db:ping或纯pop测试:在项目根目录跑go run -tags development main.go+ 手动连一次 DB,能通就排除驱动问题
模板渲染时报 template not found
这是路径约定和拼写问题,不是文件没放对位置。
Buffalo框架 1.0.1 版本源码包下载,适合需要错误处理改进、依赖更新、render.Download 注释和 request logger 调整的 v1 项目。
-
r.HTML("users/show.html")是错的——Buffalo 不接受斜杠路径,得写成r.HTML("users.show"),对应templates/users/show.html - 文件名必须全小写,
Show.html或SHOW.html都会失败(Linux/macOS 区分大小写) - 首次运行前没建
templates/目录?执行mkdir -p templates/users再放文件 - 想启动时就暴露模板错误,加一行
app.PrecompileTemplates()到app.go的App()函数里
Handler 里调第三方接口,日志只显示 500 却看不到 panic 堆栈
因为 middleware.Recovery 把 panic 吞了,而且默认 buffalo dev 会封装日志。
- 开发阶段先注释掉
app.Use(middleware.Recovery)(在app.go中) - 改用
go run main.go启动,绕过 CLI 日志层 - 在 handler 里加
defer func() { if r := recover(); r != nil { log.Printf("PANIC: %v", r) } }() - HTTP 超时必须手动构造 context:
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second),再传给http.NewRequestWithContext(ctx, ...);用c.Request().Context()是无效的
前端带 credentials 请求跨域失败,浏览器报 No 'Access-Control-Allow-Credentials'
Buffalo 默认 CORS 中间件禁止 credentials,且不允许开启。
- 删掉
app.Use(middleware.Default)或其中的cors.New调用 - 换用
github.com/rs/cors:app.Use(cors.New(cors.Options{AllowCredentials: true, AllowedOrigins: []string{"http://localhost:3000"}})) -
AllowedOrigins不能是"*",必须写具体 origin - 补一条 OPTIONS 路由:
app.Options("/api/{a:path}", buffalo.WrapHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))) - 前端 fetch 必须带
credentials: 'include',否则服务端设了也没用
GO_ENV、DATABASE_URL、模板路径写法、中间件是否覆盖默认行为——这四点对上了,80% 的“运行报错”当场消失。










