You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 05:25:19