在 api 响应中返回 postgres 错误

我的代码中有两个简单的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。但对于用户来说,这似乎不是一个好消息。user


main.go


package main


import (

    "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 models


import (

    u "go_contacts/utils"


    "github.com/jinzhu/gorm"

)


// User base model

type User struct {

    gorm.Model

    Username string `json:"username" gorm:"unique"`

    Password string `json:"password"`

    Email    string `json:"email"`

}


// Create new user

func (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

}


芜湖不芜
浏览 78回答 2
2回答

吃鸡游戏

至于 pq v1.5.2 和 gorm v1.9.12首先,您需要确定创建方法调用是否返回错误。这样err := GetDB().Create(user).Errorif err != nil {&nbsp; &nbsp; // code to handle error}然后pq包具有映射到postgres服务器错误的特殊类型。它包含可以帮助您识别错误严重性,代码,与错误相关的表等字段。psql 字段标识符的完整列表可以在错误和通知消息字段https://www.postgresql.org/docs/current/protocol-error-fields.html要解决您的问题作为一个选项,我们可以使用字段Code这是错误代码的字符串类型表示形式。但首先,我们需要强制转换错误并检查类型转换是否成功。这样err := GetDB().Create(user).Errorif err != nil {&nbsp; &nbsp; pqErr, ok := err.(pq.Error)&nbsp; &nbsp; if !ok {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)&nbsp; &nbsp; }&nbsp; &nbsp; // 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).Errorif err != nil {&nbsp; &nbsp; pqErr, ok := err.(pq.Error)&nbsp; &nbsp; if !ok {&nbsp; &nbsp; &nbsp; &nbsp; log.Fatal(err)&nbsp; &nbsp; }&nbsp; &nbsp; // note that type casting here is redundant and used for showing specific&nbsp;&nbsp; &nbsp; // string type from pq library&nbsp; &nbsp; if pqErr.Code == pq.ErrorCode("23505") { // 23505 is unique_violation error code for psql&nbsp; &nbsp; &nbsp; &nbsp; // now you can create error and write it to a message to return it for&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; // a client&nbsp; &nbsp; }}

蝴蝶不菲

根据注释,gorm 提供对“创建记录”函数中数据库错误的访问,如下所示:result := GetDB().Create(user)if result.Error != nil {&nbsp; &nbsp;// Do something with the error}请注意,检查错误字符串可能会使您的应用程序数据库成为特定数据库(但这可能不是您的问题)。这个问题的答案可能会提供进一步的帮助。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go