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

Go后端访问/posts/路由出现404错误,请求技术排查

问题排查与修复方案

核心问题分析

你遇到的404 page not found主要是路由挂载逻辑错误,同时存在参数不匹配、方法未实现等次要问题,以下是具体修复步骤:


1. 修复路由挂载逻辑(最关键)

你的Reroute方法存在语法错误,且未将/posts路由整合到Server的主路由中,导致请求无法被正确分发:

// 修正Reroute方法,移除错误语法并整合主路由逻辑
func (s *Server) Reroute() *chi.Mux {
    r := chi.NewRouter()
    // 复用原SetupServer的中间件与根路由
    r.Use(middleware.Logger)
    r.Use(middleware.Recoverer)
    r.Use(cors.Handler(cors.Options{
        // 补充你的CORS配置
    }))
    r.Get("/", func(w http.ResponseWriter, r *http.Request) {
        _, err := w.Write([]byte("Main page"))
        if err != nil {
            return
        }
    })
    // 正确挂载posts子路由
    r.Mount("/posts", PostRouter(s.db))
    return r
}

// 修改Server初始化方法,使用修正后的Reroute生成主路由
func New(db *db.Queries) *Server{
    s := &Server{
        Version: "1.0.0",
        db: db,
    }
    s.router = s.Reroute()
    return s
}

2. 修正URL参数名不匹配

HandleGetPost中使用的参数名post_ID与路由定义的{post_id}大小写不一致(chi参数区分大小写),会导致无法正确获取路径参数:

// 修改HandleGetPost中的参数名,与路由定义一致
func (h *Handler) HandleGetPost(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    postID := chi.URLParam(r, "post_id") // 把post_ID改为post_id
    post, err := h.db.GetPost(ctx, postID)
    // ... 原有逻辑
}

3. 补充未实现的Handler方法

PostRouter中注册了HandleCreatePost、HandleUpdatePost、HandleDeletePost,但你的Handler.go中没有对应实现,会导致请求这些路由时触发panic,示例补充HandleCreatePost:

func (h *Handler) HandleCreatePost(w http.ResponseWriter, r *http.Request) {
    ctx := r.Context()
    var post Post
    if err := json.NewDecoder(r.Body).Decode(&post); err != nil {
        respondWithError(w, http.StatusBadRequest, "无效请求体")
        return
    }
    createdPost, err := h.db.CreatePost(ctx, db.CreatePostParams{
        PostID:   post.PostID,
        Title:    post.Title,
        Content:  post.Content,
        Category: post.Category,
    })
    if err != nil {
        respondWithError(w, http.StatusInternalServerError, "创建文章失败")
        return
    }
    respondwithJSON(w, http.StatusCreated, createdPost)
}

验证Handler工作状态的方法

  • 添加日志打印:在Handler方法开头加入日志,确认是否被调用
    func (h *Handler) HandleListPosts(w http.ResponseWriter, r *http.Request) {
        log.Println("HandleListPosts 被触发") // 新增日志
        ctx := r.Context()
        // ... 原有逻辑
    }
    
    启动服务后访问http://localhost:4000/posts,若控制台输出日志,说明Handler已正常接收请求;若无输出,说明路由仍未挂载成功。
  • 用curl测试:
    curl http://localhost:4000/posts
    curl http://localhost:4000/posts/your-test-post-id
    

整体流程梳理

  1. 客户端请求/posts → 主路由匹配到挂载的/posts前缀 → 转发到PostRouter的根路径 → 触发HandleListPosts
  2. Handler调用数据库的ListPost方法获取数据 → 序列化为JSON返回给客户端

内容的提问来源于stack exchange,提问作者Dương Bao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 16:02:08