我试图解决这个恐慌错误,我刚刚在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
1条答案
按热度按时间zzwlnbp81#
您正在向
db
变量的Db
字段的Create
方法传递一个未初始化的指针。你能先试着初始化数据库连接吗?
}