为了账号安全,请及时绑定邮箱和手机立即绑定

在 api 响应中返回 postgres 错误

在 api 响应中返回 postgres 错误

Go
芜湖不芜 2022-08-01 10:20:30
我的代码中有两个简单的api方法。具有 endpoind 的方法创建用户。领域是独一无二的。当我尝试使用数据库中已经存在的相同用户名创建用户时,我在控制台中出现错误:/api/user/createusername(/home/andrej/go/src/go_contacts/models/users.go:19) [2020-12-23 22:03:10]  pq: duplicate key value violates unique constraint "users_username_key"我想显示此错误以响应用户,或者以某种方式识别代码中的错误类型,以便为用户显示不同的错误消息。我只知道,如果我有错误,返回我id = 0。但对于用户来说,这似乎不是一个好消息。usermain.gopackage mainimport (    "fmt"    "go_contacts/controllers"    "net/http"    "os"    "github.com/gorilla/mux"    "github.com/joho/godotenv")func main() {    godotenv.Load(".env")    router := mux.NewRouter()    router.HandleFunc("/", controllers.ReturnHello).Methods("GET")    router.HandleFunc("/api/user/create", controllers.CreateUser).Methods("POST")    port := os.Getenv("PORT")    if port == "" {        port = "8000"    }    err := http.ListenAndServe(":"+port, router)    if err != nil {        fmt.Print(err)    }}models.go使用用户结构:package modelsimport (    u "go_contacts/utils"    "github.com/jinzhu/gorm")// User base modeltype User struct {    gorm.Model    Username string `json:"username" gorm:"unique"`    Password string `json:"password"`    Email    string `json:"email"`}// Create new userfunc (user *User) Create() map[string]interface{} {    GetDB().Create(user)    if user.ID <= 0 {        return u.Message(false, "Failed to create user, connection error.")    }    response := u.Message(true, "Account has been created")    response["user"] = user    return response}
查看完整描述

2 回答

?
吃鸡游戏

TA贡献1829条经验 获得超7个赞

至于 pq v1.5.2 和 gorm v1.9.12


首先,您需要确定创建方法调用是否返回错误。这样


err := GetDB().Create(user).Error

if err != nil {

    // code to handle error

}

然后pq包具有映射到postgres服务器错误的特殊类型。它包含可以帮助您识别错误严重性,代码,与错误相关的表等字段。


psql 字段标识符的完整列表可以在


错误和通知消息字段


https://www.postgresql.org/docs/current/protocol-error-fields.html


要解决您的问题作为一个选项,我们可以使用字段


Code

这是错误代码的字符串类型表示形式。但首先,我们需要强制转换错误并检查类型转换是否成功。这样


err := GetDB().Create(user).Error

if err != nil {

    pqErr, ok := err.(pq.Error)

    if !ok {

        log.Fatal(err)

    }


    // code to handle specific error code

}

错误代码列表可以在官方postgresql文档中找到 https://www.postgresql.org/docs/9.3/errcodes-appendix.html


以及实际转到pq库中 github.com/lib/pq/error.go 的错误进行pq特定映射


最后,我们可以通过代码将错误处理为重复错误


err := GetDB().Create(user).Error

if err != nil {

    pqErr, ok := err.(pq.Error)

    if !ok {

        log.Fatal(err)

    }


    // note that type casting here is redundant and used for showing specific 

    // string type from pq library

    if pqErr.Code == pq.ErrorCode("23505") { // 23505 is unique_violation error code for psql

        // now you can create error and write it to a message to return it for 

        // a client

    }

}


查看完整回答
反对 回复 2022-08-01
?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

根据注释,gorm 提供对“创建记录”函数中数据库错误的访问,如下所示:


result := GetDB().Create(user)

if result.Error != nil {

   // Do something with the error

}

请注意,检查错误字符串可能会使您的应用程序数据库成为特定数据库(但这可能不是您的问题)。这个问题的答案可能会提供进一步的帮助。



查看完整回答
反对 回复 2022-08-01
  • 2 回答
  • 0 关注
  • 77 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信