刚开始使用Go,目前正在尝试创建REST API。使用gorm
& gin
也是这样做的。卡住的地方是,我试图从error
对象中获取值,但是我无法以直接的方式执行此操作。
error
类型,如果我知道的话,只有一个Error
方法可用,它提供了对象的Message
部分中的任何内容。这是我的错误对象。
{
"Severity": "ERROR",
"Code": "23505",
"Message": "duplicate key value violates unique constraint \"uix_users_email\"",
"Detail": "Key (email)=(johndoe@gmail.com) already exists.",
"Hint": "",
"Position": "",
"InternalPosition": "",
"InternalQuery": "",
"Where": "",
"Schema": "public",
"Table": "users",
"Column": "",
"DataTypeName": "",
"Constraint": "uix_users_email",
"File": "nbtinsert.c",
"Line": "433",
"Routine": "_bt_check_unique"
}
现在,我想要做的是,访问Detail
密钥,我有点困惑。这就是我目前为实现这一目标所做的工作:
if err := a.DB.Create(&user).Error; err != nil {
val, _ := json.Marshal(err)
m := make(map[string]string)
json.Unmarshal(val, &m)
context.JSON(422, gin.H{"error": m["Detail"]})
return
}
但这似乎有点矫枉过正。我必须Marshal
出现错误,然后Unmarshal
将其放入地图&然后最后使用它。
有更简单的方法吗?
答案 0 :(得分:1)
将其断言至pq.Error
并访问字段as explained in the pq
docs:
if err, ok := err.(*pq.Error); ok {
fmt.Println("pq error:", err.Code.Name())
// Or whatever other field(s) you need
}