Go Fiber中MongoDB FindOne返回nil但数据存在求助
问题排查与修复方案
1. 致命逻辑错误:无条件返回404响应
你的代码末尾无论查询结果如何,都会强制返回http.StatusNotFound——哪怕数据库查询成功(err == nil),也会走到这个分支。这是导致"明明有匹配用户却返回无数据"的核心原因。
修复后的错误处理逻辑:
err := userCollection.FindOne(ctx, bson.M{"email": input.Email}).Decode(&input) if err != nil { if err == mongo.ErrNoDocuments { fmt.Println("User not found>>>") return c.Status(http.StatusNotFound).JSON(responses.UserResponse{ Status: http.StatusNotFound, Message: "Account not found", Data: &fiber.Map{"data": "No Account belongs to given credentials"}}) } // 处理数据库连接、解码等其他错误 return c.Status(http.StatusInternalServerError).JSON(responses.UserResponse{ Status: http.StatusInternalServerError, Message: "database error", Data: &fiber.Map{"data": err.Error()}}) } // 查询成功后的逻辑:比如生成登录令牌、返回用户信息 return c.Status(http.StatusOK).JSON(responses.UserResponse{ Status: http.StatusOK, Message: "sign in successful", Data: &fiber.Map{"user": input}})
2. 避免Decode覆盖请求变量
你将查询结果解码到接收请求的input变量中,可能会覆盖请求里的其他字段(比如密码)。建议单独声明变量存储查询结果:
var foundUser models.User err := userCollection.FindOne(ctx, bson.M{"email": input.Email}).Decode(&foundUser)
3. 验证邮箱归一化的一致性
确认util.NormalizeEmail处理后的邮箱,和数据库中存储的邮箱完全一致(比如是否统一了大小写、去除了多余符号、处理了加号后缀等)。可以直接在数据库执行查询验证:
db.users.find({ "email": "打印的归一化邮箱地址" })
4. 检查上下文与数据库连接
虽然10秒超时足够,但确保数据库连接正常,且FindOne执行过程中上下文没有被意外取消(当前代码的defer cancel()没问题,无需调整)。
内容的提问来源于stack exchange,提问作者Biswas Sampad
相关产品推荐
相关产品推荐

