package router import ( "electricity_bill_calc/controller" "electricity_bill_calc/logger" "electricity_bill_calc/security" "fmt" "runtime" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/compress" "github.com/gofiber/fiber/v2/middleware/recover" "go.uber.org/zap" ) func App() *fiber.App { app := fiber.New(fiber.Config{ BodyLimit: 10 * 1024 * 1024, EnablePrintRoutes: true, EnableTrustedProxyCheck: false, Prefork: false, ErrorHandler: errorHandler, }) app.Use(compress.New()) app.Use(recover.New(recover.Config{ EnableStackTrace: true, StackTraceHandler: stackTraceHandler, })) app.Use(logger.NewLogMiddleware(logger.LogMiddlewareConfig{ Logger: logger.Named("App"), })) app.Use(security.SessionRecovery) controller.InitializeUserController(app) controller.InitializeRegionController(app) controller.InitializeChargesController(app) controller.InitializeParkController(app) controller.InitializeMaintenanceFeeController(app) controller.InitializeMeter04kVController(app) controller.InitializeReportController(app) controller.InitializeEndUserController(app) controller.InitializeWithdrawController(app) controller.InitializeStatisticsController(app) controller.InitializeGodModeController(app) return app } // 全局错误处理 func errorHandler(c *fiber.Ctx, err error) error { code := fiber.StatusInternalServerError if e, ok := err.(*fiber.Error); ok { code = e.Code } e := c.Status(code).SendString(err.Error()) if e != nil { return c.Status(fiber.StatusInternalServerError).SendString(err.Error()) } return nil } // 处理Recover中间件输出的栈追踪信息 func stackTraceHandler(c *fiber.Ctx, e interface{}) { buf := make([]byte, 1024) buf = buf[:runtime.Stack(buf, false)] logger.Named("App", "StackTrace").Warn(fmt.Sprintf("panic: %+v", e), zap.ByteString("trace", buf), zap.Any("origin", e)) }