Iris必须手动集成mongo-go-driver,启动时用context.WithTimeout创建全局复用的*mongo.Client并Ping验证,退出前Disconnect;handler中通过闭包或DI传入预建collection,所有DB操作须用请求上下文。

必须手动集成 mongo-go-driver,Iris 不提供任何 MongoDB 封装或自动连接能力。所有连接复用、上下文传递、超时控制、优雅关闭都得自己写,硬连是唯一路径。
启动时怎么安全创建并复用 *mongo.Client
Go 的 mongo.Client 是线程安全的,必须只创建一次,挂载为包级变量或注入到 Iris 应用中,绝不能在 handler 里反复调用 mongo.Connect()。
- 用
context.WithTimeout(context.Background(), 10*time.Second)包裹连接上下文,避免 DNS 卡死或副本集选举失败导致程序假死 - 连接后立即调
client.Ping(ctx, readpref.Primary())验证可用性——不验证的话,错误会延迟到第一次查询才暴露 - 监听
os.Interrupt或os.Kill,在退出前调client.Disconnect(ctx);Iris 没内置关机钩子,漏掉会导致连接泄漏 - 推荐注册到
app.ConfigureContainer()(v12.2.11+),后续可通过 DI 获取,比全局变量更易测、更可控
handler 中怎么拿到 *mongo.Collection 实例
别在每个路由函数里重复写 client.Database("db").Collection("coll"),这虽轻量但易错、难替换、难 mock。
- 初始化时就构造好:
usersColl := db.Collection("users") - 用闭包传入 handler:
app.Get("/users", userHandler(usersColl)),清晰无副作用 - 若用 DI 风格,需在
ConfigureContainer中注册*mongo.Collection类型,再在 handler 签名中声明接收,如func(ctx iris.Context, coll *mongo.Collection) - 严禁用
ctx.Values().Set()存 collection——值类型不安全,中间件可能覆盖,且无法被 DI 容器管理
增删改查操作必须用请求上下文,不能用 context.Background()
所有 DB 操作(Find、InsertOne、UpdateByID、DeleteOne)都要求传 context.Context。传 context.Background() 会让数据库操作脱离 HTTP 生命周期,拖垮连接池,也无法响应客户端取消。
立即学习“go语言免费学习笔记(深入)”;
- 从
iris.Context提取:ctx := c.Request().Context(),再按需加超时,例如ctx, cancel := context.WithTimeout(ctx, 5*time.Second),用完记得cancel() - 错误里出现
context deadline exceeded是正常反馈,说明超时机制生效了,不是 bug - filter 构造务必用
primitive.M,比如primitive.M{"name": "alice"},比map[string]interface{}更安全,避免类型推导歧义 - _id 字段必须是
primitive.ObjectID类型,并带bson:"_id,omitempty"tag;结构体里定义成string会导致插入后 ID 为空,后续primitive.ObjectIDHex()解析 panic
常见静默失败点:filter 写错、游标没检查、err 被忽略
Find() 返回空结果却不报错,数据其实存在——这是最典型的“安静出错”场景。
- 检查 filter 是否用了正确字段名:结构体字段
UserName对应 BSON 是"user_name"还是"username",取决于bsontag - 执行前用
fmt.Printf("%+v", filter)看实际生成的 BSON,确认结构符合预期 - 即使
Find()不报错,也必须用cursor.Next()和cursor.Err()检查迭代过程是否出错 - 插入后不检查
result.InsertedID,更新后不看result.MatchedCount和result.ModifiedCount,等于没做错误处理
真正麻烦的从来不是写几行增删改查,而是 context 怎么套、超时怎么分层、filter 怎么验、ObjectId 怎么对齐、错误怎么收口——这些点漏一个,线上就容易出现查不到数据却没报错、请求已断开查询还在跑、ID 解析 panic 等难以复现的问题。


















