From 48e739f06d8609dc5006928a243a8cb0ec41491a Mon Sep 17 00:00:00 2001 From: krau <71133316+krau@users.noreply.github.com> Date: Sun, 16 Aug 2026 20:28:39 +0800 Subject: [PATCH] fix: fail fast when API listen fails Bind synchronously and surface errors instead of logging them. --- api/server.go | 10 +++++++++- cmd/run.go | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/api/server.go b/api/server.go index 9418e1e..140f36d 100644 --- a/api/server.go +++ b/api/server.go @@ -3,6 +3,7 @@ package api import ( "context" "fmt" + "net" "net/http" "time" @@ -90,9 +91,16 @@ func (s *Server) Start(ctx context.Context) error { logger.Infof("Starting API server on %s", s.httpServer.Addr) + // Bind synchronously so listen failures (e.g. port already in use) are + // returned to the caller instead of being silently logged in a goroutine. + ln, err := net.Listen("tcp", s.httpServer.Addr) + if err != nil { + return fmt.Errorf("failed to listen on %s: %w", s.httpServer.Addr, err) + } + // 在 goroutine 中启动服务器 go func() { - if err := s.httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { + if err := s.httpServer.Serve(ln); err != nil && err != http.ErrServerClosed { logger.Errorf("API server error: %v", err) } }() diff --git a/cmd/run.go b/cmd/run.go index 5dfe565..7499296 100644 --- a/cmd/run.go +++ b/cmd/run.go @@ -88,7 +88,7 @@ func initAll(ctx context.Context) (<-chan struct{}, error) { } } if err := api.Start(ctx); err != nil { - logger.Error("Failed to start API server", "error", err) + logger.Fatal("Failed to start API server", "error", err) } return bot.Init(ctx), nil }