Fiber 默认不提供 Session 支持,需手动集成中间件;因其“轻量优先”设计哲学,Session 作为有状态扩展交由社区维护,最常用的是 github.com/gofiber/fiber/v2/middleware/session。

Fiber 默认不提供 Session 支持,必须手动集成中间件;直接用 fiber.New() 启动服务时,ctx.Session() 会 panic。
为什么 Fiber 没有内置 Session?
Fiber 的设计哲学是“轻量优先”,Session 属于有状态、需存储和加密的扩展能力,官方选择交由社区中间件维护。目前最稳定的是 github.com/gofiber/fiber/v2/middleware/session,它支持内存、Redis、PostgreSQL 等多种存储后端。
常见错误现象:ctx.Session() undefined 或 panic: session store not initialized,本质都是没正确挂载中间件或没传入 store 实例。
- 必须显式调用
session.New()创建 store,并作为中间件传给app.Use() - 不能只 import 包而不初始化 store —— import 不等于启用
- 内存 store(
session.New()默认)仅适合开发,重启即丢失数据
如何配置 Redis 存储 Session?
生产环境必须换 Redis,否则多实例部署时会话不一致。关键点在于:store 初始化时机早于路由注册,且 Redis 客户端需提前建立连接。
批量分析录音转写,输出多维度拓客报告。触发词:录音分析、总结、音频总结、拜访记录总结。当用户提及「分析录音」「看看录音数据」「最近的录音」「通话记录」且意图为批量统计/分析时触发。仅出现「录音」或「拜访」时需结合上下文,若仅查看单条详情则不触发。
示例片段:
import (
"github.com/gomodule/redigo/redis"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/session"
)
// 复用 redis.Pool,不要每次 New() 都新建连接
pool := &redis.Pool{
MaxIdle: 10,
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "localhost:6379")
},
}
store := session.New(session.Config{
Store: redis.New(store.Config{
Pool: pool,
}),
})
app.Use(store)
-
redis.New()是 fiber session 提供的适配器,不是 redigo 自带的类型 - 若用
github.com/redis/go-redis/v9,得自己实现session.Store接口,官方未封装 - Session ID 默认通过 Cookie 传输,
Config.Key可自定义 cookie 名(默认session_id)
怎么读写和销毁 Session 数据?
Session 对象本身是 request-scoped 的,每个请求拿到的 sess 实例彼此隔离,但底层共享同一个 store key。
典型操作:
// 获取 session(自动从 cookie 解析 ID,查 store)
sess, err := store.Get(c)
if err != nil { panic(err) }
// 写值(值必须可序列化,如 string/int/map,不支持函数或 channel)
sess.Set("user_id", 123)
sess.Set("cart", []string{"apple", "banana"})
// 读值(需要类型断言)
if uid, ok := sess.Get("user_id").(int); ok {
fmt.Println(uid)
}
// 删除单个键
sess.Delete("cart")
// 彻底销毁 session(清空 store + 设置 cookie 过期)
sess.Destroy()
-
sess.Get()返回interface{},务必做类型判断,否则运行时 panic - 修改值后无需手动 save ——
sess.Save()在响应写出前由中间件自动调用 - 如果请求中没带有效 session cookie,
store.Get()会创建新 session,ID 在响应 header 中返回
Session 的加密密钥(Config.KeyGenerator 和 Config.SigningKey)容易被忽略,没设 signing key 时 cookie 不签名,前端可篡改内容;密钥一旦上线就不能再改,否则所有存量 session 失效。

















