Google AppEngine部署Go应用出现404错误求助
我帮你排查这个问题,核心原因是你在App Engine环境的初始化代码里,调用appengine.Main()的顺序出错了,导致路由根本没被注册上,所以才会返回默认的404页面。
问题分析
看你的App Engine专属代码:
func init() { r := server.Router() appengine.Main() http.Handle("/", r) }
appengine.Main()这个函数会启动App Engine的请求服务循环,一旦调用它,后面的代码就不会执行了。你先启动了服务,再注册路由,等于路由根本没被添加到HTTP请求处理链里,App Engine只能用默认的handler处理请求,自然返回404。
修复步骤
- 调整
init()函数的代码顺序
把appengine.Main()放到最后,确保路由先注册完成再启动服务:
// +build appengine package main import ( "net/http" "github.com/Test/test/server" "google.golang.org/appengine" ) func init() { r := server.Router() http.Handle("/", r) // 先把chi路由挂载到默认ServeMux appengine.Main() // 再启动App Engine服务 }
- 验证chi路由的匹配逻辑
你的路由配置逻辑是合理的:
func Router() *chi.Mux { r := chi.NewRouter() // home r.Get("/", handlers.RootHandler) // api r.Route("/api", func(r chi.Router) { r.Get("/*", handlers.NotSupportedAPIHandler) }) r.Get("/*", handlers.RootHandler) return r }
可以先在本地测试,比如用curl http://localhost:8182/api/test,确认NotSupportedAPIHandler能正常返回JSON格式的404,排除处理器本身的问题。
本地模拟App Engine调试
用Google Cloud SDK的dev_appserver.py app.yaml命令在本地模拟App Engine环境运行,这样能快速验证修复后的代码是否生效,不用每次都部署到云端。重新部署到App Engine
确保部署的是修改后的代码,部署完成后可以在云控制台的日志里查看是否有路由相关的请求记录,确认自定义处理器是否被触发。
额外提示
如果你的App Engine使用的是Go 1.11及以上的运行时,其实可以考虑统一代码,不用分appengine和非appengine的构建标签。比如直接用http.ListenAndServe("", r)(空字符串让系统自动分配端口),App Engine会适配运行环境,这样能减少代码维护成本。
内容的提问来源于stack exchange,提问作者Soesah

