Buffalo路由必须在App()函数内通过app.GET()等方法显式注册到*buffalo.App实例,且Handler必须为func(c buffalo.Context) error类型,否则访问返回404。

Buffalo 的路由不是写在 main.go 里,也不是靠独立 routes.go 文件自动加载——它必须注册进 app.Routes() 返回的 http.Handler 实例中,否则访问就是 404。
路由注册必须在 actions/app.go 的 App() 构建器内完成
Buffalo 把整个应用生命周期封装在 App() 函数返回的 *buffalo.App 实例里。所有路由都得挂在这个实例上,比如:
func App() *buffalo.App {
app := buffalo.New(buffalo.Options{
Env: ENV,
SessionName: "_myapp_session",
})
// ✅ 正确:在这里注册
app.GET("/hello", HelloHandler)
// ❌ 错误:放在这里没用(哪怕函数存在)
// HelloHandler 不会自动被发现或绑定
return app
}
-
app.GET()、app.POST()等方法必须在App()函数体内调用,不能放到包级变量或 init() 中 - 如果你改了
actions/app.go却没生效,先确认是否漏掉了app.GET(...)这一行 -
buffalo dev启动时会调用app.Routes(),它内部才真正把app实例转成可服务的http.Handler
HelloHandler 必须是 func(c buffalo.Context) error 类型
Buffalo 不接受任何其他签名。常见错误包括:
- 写成
func HelloHandler(c buffalo.Context) {}(无返回值)→ 编译报错:cannot use HelloHandler as buffalo.Handler - 写成
func HelloHandler(w http.ResponseWriter, r *http.Request)(原生 HTTP 签名)→ 路由注册失败,启动时报 panic - 写成
func HelloHandler(c buffalo.Context, id int) error(多参数)→ 同样触发类型不匹配错误
正确写法:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
func HelloHandler(c buffalo.Context) error {
return c.Render(200, r.JSON(map[string]string{"msg": "hello"}))
}
- 成功必须返回
nil;非nilerror 会交由全局错误中间件处理(如渲染errors/500.html) - 不要直接操作
http.ResponseWriter,否则绕过 Buffalo 生命周期,可能卡住响应或 panic - 如果想返回 JSON,用
r.JSON;HTML 模板则用r.HTML("hello.html"),路径必须是templates/hello.html(小写,无大写首字母)
为什么访问 /hello 返回空白页或 404?检查这三点
最常卡在这几个地方,而不是代码逻辑本身:
- 没执行
buffalo dev—— 它不是普通go run main.go,必须用 CLI 启动才能加载app.Routes() -
HelloHandler函数定义在别的文件但没被 import 进actions/app.go(Go 包可见性问题) - 模板路径写错:比如用了
r.HTML("Hello.html")或r.HTML("templates/hello.html"),Buffalo 只认templates/hello.html(根目录起始,且文件名全小写)
另外注意:Buffalo 默认不启用热重载模板,改了 .html 文件要手动重启 buffalo dev,或者加 --debug 参数启用部分实时刷新。
真正容易被忽略的是:路由注册和 handler 类型是强耦合的两个环节,缺一不可。很多人只盯着 handler 写对了,却忘了在 App() 里显式挂上去——而 Buffalo 不会报错提示“你忘了注册”,只会静默 404。


















