刚开始使用 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
将其放入映射中,最后使用它。
有没有更简单的方法来做到这一点?
最佳答案
将其断言给 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
}
关于go - 将错误转换为映射或结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48027084/