应直接读取APP_ENV环境变量并设默认值:env := os.Getenv("APP_ENV"); if env == "" { env = "development" },且必须在fiber.New()前完成,确保Config和中间件按环境正确初始化。

直接读 APP_ENV,别依赖配置文件,别用 fiber.Default() 自动加载——Fiber 本身不管理环境,它只认你传进去的 fiber.Config 和中间件注册逻辑。
怎么读取和判断 APP_ENV
Go 没有运行时自动注入环境变量的机制,必须手动读、手动 fallback。核心就两行:
env := os.Getenv("APP_ENV")
if env == "" {
env = "development"
}
常见错误现象:
-
os.Getenv("NODE_ENV")—— Fiber 不认这个,Kubernetes 和 Docker 也默认不设它 - 没 fallback 导致
env == "",后续所有条件分支失效(比如日志没开、压缩没启) - 在
fiber.New()之后才读环境变量——晚了,Config已固化
不同环境该配什么 Config 和中间件
环境差异主要体现在三处:错误处理粒度、日志开关、响应压缩。不要写 if-else 堆砌,用结构体映射更清晰:
config := fiber.Config{
DisableStartupMessage: true,
ErrorHandler: func(c *fiber.Ctx, err error) {
if env == "production" {
c.Status(fiber.StatusInternalServerError).SendString("Internal Server Error")
} else {
c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{"error": err.Error()})
}
},
}
中间件注册也要按环境控制:
使用 uber-go/dig 在 Golang 中实现依赖注入——基于反射容器,提供 Provide/Invoke、dig.In/dig.Out 参数与结果对象,支持命名依赖等
-
env == "development"→ 可加logger.New()、recovery.New() -
env == "production"→ 关 logger,开compress.New(),禁用requestid(若已由 LB 注入) -
env == "staging"→ 日志可开但不打敏感字段,压缩开但不启用 Brotli
为什么不能把配置写进 JSON/YAML 文件
不是不能,而是不该作为主路径。Fiber 部署场景(尤其是 Kubernetes)要求配置优先从环境变量注入:
- Docker/K8s 中挂载 ConfigMap 或 Secret 到环境变量比挂载文件更轻量、更原子
- 同一镜像复用多环境时,改环境变量即可,不用重建镜像或挂不同配置文件
- 文件方式容易误提交敏感值(如 DB password),而环境变量可被 CI/CD 流水线动态注入
真要用文件,也得兜底:先读 APP_ENV,再加载 config.${env}.yaml,最后仍以环境变量为最高优先级覆盖字段。
APP_ENV 的值该设成什么
推荐统一用三个值:development、staging、production。别用 dev/prod 缩写,避免拼错;别混用大小写(Production ≠ production)。
最容易被忽略的地方是:环境变量读取必须在 fiber.New() 之前完成,且所有中间件注册(app.Use())、路由注册(app.Get())都得放在环境判断之后——否则 development 的日志中间件可能在 production 环境里悄悄跑着,直到磁盘 I/O 打满才暴露。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










