Go API本地运行返回404,同事机器正常求排查方案
这种本地环境突然掉链子的情况真的让人抓狂,既然代码在团队其他成员那里能正常运行,那咱们就把排查重点放在你的本地环境细节上,给你列几个容易忽略的方向:
仔细核对请求地址与端口
你代码里服务器监听的是8080端口,启动日志也会打印listening on port 8080,但一定要确认你实际请求的地址是http://localhost:8080/——有没有不小心手滑输错了端口?或者之前开了其他服务占用8080,你改了代码里的port变量但没生效?
建议直接在终端用curl http://localhost:8080/测试,排除浏览器本身的问题。确认gorilla/mux路由的注册细节
你的示例代码只注册了/路径,但要检查实际项目里所有端点是不是都正确注册了?有没有不小心把路由注册代码注释掉,或者误把路由定义放在了http.ListenAndServe之后?(虽然你说之前正常,但偶尔手滑改代码是常事)
另外要注意,gorilla/mux是精确匹配路由的,比如你定义了/books,请求/books/(带尾部斜杠)就会返回404,要确保请求路径和路由定义完全一致。检查本地.env文件与环境变量
虽然数据库连接成功,但还是要确认你的week2.env文件和团队成员的版本有没有差异?有没有不小心添加了某个会影响服务器行为的变量?
另外,代码里os.LookupEnv直接忽略了错误,虽然不影响数据库连接,但如果其他依赖的环境变量为空,会不会间接导致路由问题?可以临时打印一下相关变量的值确认。排查端口占用情况
有时候重启电脑后,还是会有残留进程占用8080端口,你可以用命令检查:- Windows:
netstat -ano | findstr :8080 - macOS/Linux:
lsof -i :8080
如果发现有其他进程占用,杀掉它再重启你的API服务器试试。
- Windows:
检查防火墙与代理设置
本地防火墙可能突然拦截了8080端口的请求,可以临时关闭防火墙测试一下。另外,如果你在用VPN、浏览器代理工具,这些工具可能会把请求转发到其他地方,导致无法到达本地服务器,试试关闭代理再请求。验证本地代码与远程仓库的一致性
哪怕你觉得代码没问题,也用git diff对比一下本地代码和团队远程仓库的版本,说不定不小心改了路由相关的代码自己没察觉。换个地址测试服务器
你代码里是监听所有网卡的8080端口,试试用http://127.0.0.1:8080/代替localhost请求——有时候localhost的DNS解析会出小问题,用IP地址能绕过这个坑。
附上你的代码方便参考:
package main import ( "database/sql" "fmt" "log" "net/http" "os" _ "github.com/go-sql-driver/mysql" "github.com/gorilla/mux" "github.com/joho/godotenv" ) var port = "8080" var db *sql.DB var host string func main() { // Getting environment variables that are secret host = "localhost:8080" err := godotenv.Load("week2.env") if err != nil { log.Fatal("Error loading .env file") } // Connecting to the MySQL database pw, _ := os.LookupEnv("MYSQL_ROOT_PASSWORD") user, _ := os.LookupEnv("MYSQL_USER") ds := fmt.Sprintf("%s:%s@tcp(db:3306)/google_books", user, pw) database, err := sql.Open("mysql", ds) if err != nil { log.Fatal(err) } fmt.Println("successfully connected to db") db = database defer db.Close() // Setting up a mux router router := mux.NewRouter() // Telling the server what to listen for and what to do router.HandleFunc("/", hello) // Creating the server fmt.Printf("listening on port %s\n", port) err = http.ListenAndServe(":"+port, router) if err != nil { fmt.Println(err) } } func hello(w http.ResponseWriter, r *http.Request) { setHeaders(w, r) fmt.Println("hello world this is the homepage") } // setHeaders sets the headers for the response func setHeaders(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Origin", "*") }
内容的提问来源于stack exchange,提问作者jmaldonado

