You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Go API本地运行返回404,同事机器正常求排查方案

排查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服务器试试。
  • 检查防火墙与代理设置
    本地防火墙可能突然拦截了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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:11:34