【问题标题】:ObjectIdFromHex invalid byte error on identical strings相同字符串上的 ObjectIdFromHex 无效字节错误
【发布时间】:2021-09-03 16:54:39
【问题描述】:

我正在尝试在我的 Golang REST API 中实现 FindOne 方法。麻烦来了,我必须按 ID 搜索。我必须将 ID 转换为数据库可读的东西,所以我使用原语.ObjectIDFromHex(id) 问题是这个方法抛出了一个错误:

2021/06/19 06:56:15 encoding/hex: invalid byte: U+000A

仅当我使用来自我的 URL GET 参数的 id 调用它时。 我做了两个版本:一个带有硬编码 ID,一个带有 GET ID。请参阅下面的代码。

func Admin(id string) (bson.M, error) {
    coll, err := db.ConnectToCollection("admin")
    if err != nil {
        log.Fatal(err)
    }
    var admin bson.M

    HardCoded := "60cb275c074ab46a1aeda45e"

    fmt.Println(HardCoded) // Just to be sure : the two strings seem identical
    fmt.Println(id) 

    objetId, err := primitive.ObjectIDFromHex(id) // throws encoding error
    // objetId, err := primitive.ObjectIDFromHex(HardCoded) // Doesnt throw encoding err

    if err != nil {
        log.Fatal(err)
    }
    var ctx = context.TODO()

    if err := coll.FindOne(ctx, bson.M{"_id": objetId}).Decode(&admin); err != nil {
        log.Fatal(err)
    }
    return admin, nil
}

当然,您会想知道参数 id 的来源。 给你:

func GetAdmin(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    params := mux.Vars(r)
    admin, err := Admin(params["id"]) // Calling the Admin function above

    if err != nil {
        fmt.Println(err)
        http.Error(w, err.Error(), http.StatusUnauthorized)
    } else {
        JSON, err := json.Marshal(admin)
        if err != nil {
            http.Error(w, err.Error(), http.StatusInternalServerError)
        }
        w.Write(JSON)
    }
}

【问题讨论】:

  • id的末尾剪掉换行符:id = strings.TrimSpace(id)
  • HECC 成功了,恭喜,如果你愿意,可以将其发布为答案

标签: mongodb rest go


【解决方案1】:

从 id 末尾剪掉换行符:

id = strings.TrimSpace(id)

在调试此类问题时使用 %q 格式动词。换行在此输出中清晰可见:

fmt.Printf("%q\n", HardCoded) // prints "60cb275c074ab46a1aeda45e"
fmt.Printf("%q\n", id)        // prints "60cb275c074ab46a1aeda45e\n"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多