Gorm Panic golang:服务运行时出错:无效内存地址或空指针解引用

46scxncf  于 2023-04-09  发布在  Go
关注(0)|答案(1)|浏览(255)

我试图解决这个恐慌错误,我刚刚在GOLANG创建了一个后端,代码是我的第一步,如果你看到一些错误,告诉我!
下面是代码的第一部分,主要部分:(main.go)进入包main:
如果你看到我们有两个函数

  • main()
  • BindRoutes(function())-〉当从main函数调用它时,它接收一个绑定器
func main() {
    err := godotenv.Load(".env")
    if err != nil {
        log.Fatal(err)
    }

    // Variables de la base de datos para el struct
    host := os.Getenv("POSTGRES_HOST")
    user := os.Getenv("POSTGRES_USER")
    port := os.Getenv("POSTGRES_PORT")
    password := os.Getenv("POSTGRES_PASSWORD")
    dbname := os.Getenv("POSTGRES_DB")

    // Variables del servidor
    PORT := os.Getenv("PORT")
    JWT_SECRET := os.Getenv("JWT_SECRET")
    DB_URL := os.Getenv("DATA_BASE_URL")

    server, err := server.NewServer(context.Background(), &server.Config{
        JWTSecret:   JWT_SECRET,
        Port:        PORT,
        DatabaseUrl: DB_URL,
    })

    if err != nil {
        log.Fatal(err)
    }

    db := config.Database{
        Host:     host,
        Port:     port,
        User:     user,
        Password: password,
        Dbname:   dbname,
    }

    db.Open()

    server.Start(BindRoutes)
}

func BindRoutes(s server.Server, r *mux.Router, db *config.Database) {
    r.HandleFunc("/blog/newblog", handler.CreateNewBlog(s, db)).Methods(http.MethodPost)
}

接下来是SERVER包
这里我们有2个结构和1个接口,最重要的部分是绑定器,我不知道我是否实现得很好。

package server

import (
"context"
"errors"
"log"
"net/http"

"github.com/felipeolayao1998/backdiariodeuninge/config"
"github.com/gorilla/mux"

)

type Config struct {
Port string
JWTSecret string
DatabaseUrl string
}

type Server interface {
Config() *Config
}

type Broker struct {
config *Config
router *mux.Router
}

func (b *Broker) Config() *Config {
return b.config
}

func NewServer(ctx context.Context, config *Config) (*Broker, error) {
if config.Port == "" {
return nil, errors.New("port is required")
}
if config.JWTSecret == "" {
return nil, errors.New("jwt secret is required")
}
if config.DatabaseUrl == "" {
return nil, errors.New("database url is required")
}
broker := &Broker{
config: config,
router: mux.NewRouter(),
}
return broker, nil
}

func (b *Broker) Start(binder func(s Server, r *mux.Router, db *config.Database)) {
b.router = mux.NewRouter()
binder(b, b.router, &config.Database{})
log.Println("starting server on port", b.config.Port)
if err := http.ListenAndServe(b.config.Port, b.router); err != nil {
log.Println("error starting server:", err)
} else {
log.Fatalf("server stopped")
}
}

型号:

package Models

type Blog struct {
Id string json:"id" gorm:"type:string;default:string;primary_key;unique"
Name string json:"name" gorm:"type:varchar(255);not null"
Content string json:"content" gorm:"type:varchar(2000);not null"
Likes int json:"likes" gorm:"type:integer"
}

处理程序:这里我有一个问题,当我调用create时,它返回一个PANIC,正如你在这个问题的最后看到的。

func CreateNewBlog(s server.Server, db *config.Database) http.HandlerFunc {
       return func(w http.ResponseWriter, r *http.Request) {
           w.Header().Set("Content-type", "application/json")
           w.WriteHeader(http.StatusOK)
       
           db.Db.Create(&models.Blog{Id: "1", Name: "Felipe", Content: "fdasfasfa", Likes: 1}) //Here is the problem
   
       }
   }
   
2023/04/07 21:25:46 starting server on port :8000
   0xc00043a028 &{a2081199-a75e-4b3e-9551-3442a0fe0d21 Felipe contenido ejempo 1}
   2023/04/07 21:25:55 http: panic serving [::1]:59553: runtime error: invalid memory address or nil pointer dereference
   goroutine 18 [running]:
   net/http.(*conn).serve.func1()
           C:/Program Files/Go/src/net/http/server.go:1850 +0xbf
   panic({0x1620000, 0x1c52680})
           C:/Program Files/Go/src/runtime/panic.go:890 +0x262
   gorm.io/gorm.(*DB).Create(0x17e44c0?, {0x15d11c0?, 0xc00041c180?})
           C:/Users/Bymet/go/pkg/mod/gorm.io/gorm@v1.24.7-0.20230306060331-85eaf9eeda11/finisher_api.go:18 +0x22
   github.com/felipeolayao1998/backdiariodeuninge/handler.CreateNewBlog.func1({0x17ea340, 0xc000424000}, 0xc00042c100)
           D:/PodCast/PaginaWeb/backend/handler/handlerBlog.go:69 +0x3e5
zzwlnbp8

zzwlnbp81#

您正在向db变量的Db字段的Create方法传递一个未初始化的指针。
你能先试着初始化数据库连接吗?

func CreateNewBlog(s server.Server, db *config.Database) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-type", "application/json")
    w.WriteHeader(http.StatusOK)

    // Initialize the database connection
    err := db.Open()
    if err != nil {
        log.Fatal(err)
    }

    // Create a new blog record in the database
    db.Db.Create(&models.Blog{Id: "1", Name: "Felipe", Content: "fdasfasfa", Likes: 1})
}

}

相关问题