簡體   English   中英

連接 Gorm 和 Gin Golang

[英]Connecting Gorm and Gin Golang

我正在嘗試使用Gogormgin創建一個 API。 然而,使用直接 SQL 查詢確實有效,但它變得太麻煩了,我決定利用gorm ,這太棒了。 但是在我實施后,我無法再次啟動項目並不斷出錯

恐慌:運行時錯誤:無效的內存地址或零指針取消引用[信號SIGSEGV:分段違規代碼=0x1 addr=0xb0 pc=0x137b606]

我在這里粘貼了我的代碼和包。 如果有人能指出我的問題,我會很高興。

PostgresDoa.go

package postgres

import (
    "fmt"
    "log"
    "net/http"

    "github.com/AdieOlami/bookstore_users-api/domain/users"
    "github.com/gin-gonic/gin"
    "github.com/jinzhu/gorm"
)

type Sever struct {
    DB     *gorm.DB
    Router *gin.Engine
}

func (server *Sever) Initialize(Dbdriver, DbUser, DbPassword, DbPort, DbHost, DbName string) {
    var err error

    if Dbdriver == "mysql" {
        DBURL := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local", DbUser, DbPassword, DbHost, DbPort, DbName)
        server.DB, err = gorm.Open(Dbdriver, DBURL)
        if err != nil {
            fmt.Printf("Cannot connect to %s database", Dbdriver)
            log.Fatal("This is the error:", err)
        } else {
            fmt.Printf("We are connected to the %s database", Dbdriver)
        }
    }

    if Dbdriver == "postgres" {
        DBURL := fmt.Sprintf("host=%s port=%s user=%s dbname=%s sslmode=disable password=%s", DbHost, DbPort, DbUser, DbName, DbPassword)
        server.DB, err = gorm.Open(Dbdriver, DBURL)
        if err != nil {
            fmt.Printf("Cannot connect to %s database", Dbdriver)
            log.Fatal("This is the error:", err)
        } else {
            fmt.Printf("We are connected to the %s database", Dbdriver)
        }
    }

    server.DB.Debug().AutoMigrate(&users.User{}) //database migration
    server.Router = gin.Default()
}

func (server *Sever) Run(addr string) {
    fmt.Println("Listening to port 8080")
    log.Fatal(http.ListenAndServe(addr, server.Router))
}

UserDto.go

package users

import (
    "strings"

    "github.com/AdieOlami/bookstore_users-api/domain/base"
    "github.com/AdieOlami/bookstore_users-api/utils/errors"
    "github.com/jinzhu/gorm"
    uuid "github.com/satori/go.uuid"
)

type User struct {
    base.Base
    UserID    uuid.UUID `gorm:"type:uuid;column:userId;not null;" json:"userId"`
    FirstName string    `gorm:"size:255;not null;unique;column:firstName" json:"firstName"`
    LastName  string    `gorm:"size:255;not null;unique;column:lastName" json:"lastName"`
    Email     string    `gorm:"size:100;not null;unique;column:email" json:"email"`
}

func (user *User) Validate() *errors.Error {
    user.Email = strings.TrimSpace(strings.ToLower(user.Email))
    if user.Email == "" {
        return errors.NewBadRequestError("invalid email address")
    }
    return nil
}

func (user *User) SaveUser(db *gorm.DB) *errors.Error {

    var err error
    err = db.Debug().Create(&user).Error
    if err != nil {
        return errors.NewInteralServerError(err.Error())
    }
    return nil
}

用戶服務

package services

import (

    "github.com/AdieOlami/bookstore_users-api/domain/users"
    "github.com/AdieOlami/bookstore_users-api/utils/errors"
)

func (server *Server) CreateUser(user users.User) (*users.User, *errors.Error) {

    if err := user.Validate(); err != nil {
        return nil, err
    }

    if err := user.SaveUser(server.DB); err != nil {
        return nil, err
    }
    return &user, nil
}

用戶控制器

package users

import (
    "net/http"
    "strconv"

    "github.com/AdieOlami/bookstore_users-api/domain/users"
    "github.com/AdieOlami/bookstore_users-api/services"
    "github.com/AdieOlami/bookstore_users-api/utils/errors"
    "github.com/gin-gonic/gin"
)

var (
    server = services.Server{}
)

// CREATE USER
func CreateUser(c *gin.Context) {
    var user users.User

    if err := c.ShouldBindJSON(&user); err != nil {
        // TODO: hnadle json error return bad request
        err := errors.NewBadRequestError("invalid json body")
        c.JSON(err.Status, err)
        // fmt.Println(err.Error())
        return
    }
    result, saveErr := server.CreateUser(user)
    if saveErr != nil {
        // TODO: handle user createing error
        c.JSON(saveErr.Status, saveErr)
        return
    }
    c.JSON(http.StatusCreated, result)
}

路由

package app

import (
    "github.com/AdieOlami/bookstore_users-api/controllers/users"
    "github.com/AdieOlami/bookstore_users-api/database/postgres"
)

var (
    server = postgres.Sever{}
)

func initializeRoutes() {

    server.Router.POST("/users", users.CreateUser)
}

應用程序

package app

import (
    "os"

    "github.com/AdieOlami/bookstore_users-api/seed"

    _ "github.com/jinzhu/gorm/dialects/mysql"    //mysql database driver
    _ "github.com/jinzhu/gorm/dialects/postgres" //postgres database driver
)

func StartApplication() {

    server.Initialize(os.Getenv("DB_DRIVER"), os.Getenv("DB_USER"), os.Getenv("DB_PASSWORD"), os.Getenv("DB_PORT"), os.Getenv("DB_HOST"), os.Getenv("DB_NAME"))

    seed.Load(server.DB)
    server.Run(":8088")
    initializeRoutes()
}

在我的Main.go 中

func main() {
    app.StartApplication()
}

據我從您的代碼中了解到。 您在Services包中聲明了以下函數,而在Postgres包中聲明了Server對象。 這會導致將指針server *Server取消引用到無效地址。 你必須在posgres包中聲明這個函數。

func (server *Server) CreateUser(user users.User) (*users.User, *errors.Error) {

    if err := user.Validate(); err != nil {
        return nil, err
    }

    if err := user.SaveUser(server.DB); err != nil {
        return nil, err
    }
    return &user, nil
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM