【发布时间】: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 成功了,恭喜,如果你愿意,可以将其发布为答案