亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何正確地將控制器設置為 Golang 中的路由?

如何正確地將控制器設置為 Golang 中的路由?

Go
米脂 2023-06-12 14:19:01
我是Golang的新手,需要一些幫助。我正在嘗試創建沒有 ORM 的 REST API Web 服務?,F在我已成功連接到PostgreSQL數據庫。在數據庫中,我有一個名為factors. 我想創建 CRUD 操作。問題出在控制器邏輯上。主要去:package mainimport (    "github.com/gorilla/mux"    "log"    "net/http"    "rest_api/configurations"    "rest_api/controllers")func main()  {    db, err := configurations.PostgreSQLDatabase()    if err != nil {        log.Fatal(err)    }    router := mux.NewRouter()    router.StrictSlash(true)    subrouter := router.PathPrefix("/api").Subrouter()    subrouter.HandleFunc("/factors", controllers.GetFactors(db)).Methods("GET")    log.Fatal(http.ListenAndServe(":8000", router))}模型/factors.go:package modelstype Factor struct {    ID int `json:"id"`    Name string `json:"name"`}控制器看起來有多正確GetFactors?有人可以告訴我嗎?例如,我將db對象傳遞給GetFactors控制器,如下例所示。不幸的是,它似乎是不正確的??刂破?factors.go:func GetFactors(db *sql.DB, w http.ResponseWriter, req *http.Request) {    // some code}配置/PostgreSQL.go :func PostgreSQLDatabase() (*sql.DB, error) {    // Load environment variables from ".env" file.    err := godotenv.Load(".env")    if err != nil {        log.Fatal(err)    }    // Initialize database-related variables.    dbUser := os.Getenv("PostgreSQL_USER")    dbPassword := os.Getenv("PostgreSQL_PASSWORD")    dbHost := os.Getenv("PostgreSQL_HOST")    dbName := os.Getenv("PostgreSQL_DB_NAME")    dbURL := fmt.Sprintf("user=%s password=%s host=%s dbname=%s sslmode=disable", dbUser, dbPassword, dbHost, dbName)    // Create PostgreSQL database connection pool.    db, err := sql.Open("postgres", dbURL)    if err != nil {        return nil, err    }    // Ping PostgreSQL database to make sure it's alive.    err = db.Ping()    if err != nil {        log.Fatal(err)    } else {        log.Println("Web service successfully connected to remote PostgreSQL database.")    }    return db, nil}
查看完整描述

3 回答

?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

我喜歡使用的一種模式是定義您自己的Router結構,該結構具有一個mux.Router字段,并封裝諸如您的數據庫連接、應用程序配置等內容。


我發現這樣做可以在需要不同資源和開發收益時輕松更新您的路線。


首先創建一個路由器對象,它在創建時接收數據庫連接,并使其可用于您希望使用的所有路由。


路由器.go


package main


import (

    "net/http"

    "database/sql"


    "github.com/gorilla/mux"

)


type Router struct {

    router *mux.Router

    db *sql.DB

}


func NewRouter(db *sql.DB) (*Router, error) {

    router := mux.NewRouter()

    router.StrictSlash(true)

    subrouter := router.PathPrefix("/api").Subrouter()


    r := &Router{

        router: router,

        db: db,

    }


    subrouter.HandleFunc("/factors", r.GetFactors).Methods(http.MethodGet)


    return r, nil

}


func (r *Router) GetFactors(w http.ResponseWriter, req *http.Request) {

    // Now you can access your database via `r.db`

}


// Needed so we can pass our custom router to ListenAndServe.

func (r *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {

    r.router.ServeHTTP(w, req)

}

然后main.go你可以簡單地創建你的自定義路由器,將它傳遞給你的數據庫連接。然后自定義路由器可以直接傳遞給ListenAndServe.


主程序


package main


import (

    "log"

    "net/http"

    "rest_api/configurations"

    "rest_api/controllers"

)


func main()  {

    db, err := configurations.PostgreSQLDatabase()

    if err != nil {

        log.Fatal(err)

    }


    router, err := NewRouter(db)

    if err != nil {

        log.Fatalf("error initializing router: %v", err)

    }


    log.Fatal(http.ListenAndServe(":8000", router))

}

希望這會有所幫助。


查看完整回答
反對 回復 2023-06-12
?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

沒有正確的方法,它主要基于意見。


HandlerFunc 函數的語義應該是這樣的func(w http.ResponseWriter, r *http.Request),為了傳遞數據庫,你可以使用閉包,這里是一個例子。


主程序

// ... some code here 

subrouter.HandleFunc("/factors", controllers.GetFactors(db)).Methods("GET")

// ... some code here

控制器/factors.go

func GetFactors(db *sql.DB) http.HandlerFunc {

  return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {

    // some code

  })

}

另外一個選擇:


我不太確定這一點,但你可以根據你的需要調整它。初始化一個Controller結構并將數據庫傳遞給它:


主程序

// ... some code here 

db, err := configurations.PostgreSQLDatabase()

if err != nil {

    log.Fatal(err)

}

ctrl := controllers.Controller{DB: db}

subrouter.HandleFunc("/factors", ctrl.GetFactors).Methods("GET")

// ... some code here

表示 Controller 結構上的方法。在控制器中定義一個結構


控制器/factors.go

type Controller struct {

  DB *PostgreSQLDatabase

}


func (c Controller) GetFactors(w http.ResponseWriter, req *http.Request) {

    // some code

    // c.DB.MySqlMethod()

}


查看完整回答
反對 回復 2023-06-12
?
牧羊人nacy

TA貢獻1862條經驗 獲得超7個贊

您的功能GetFactors必須如下所示:


func GetFactors(w http.ResponseWriter, r *http.Request) {}

在主文件中你必須有:


subrouter.HandleFunc("/factors", controllers.GetFactors).Methods("GET")

為了獲得數據庫連接,你必須GetDB在你的包中有類似的功能"rest_api/configurations"。


在"rest_api/configurations"你必須有類似的東西:


var db *PostgreSQLDatabase


func init() {

    var err error

    db, err = configurations.PostgreSQLDatabase()

    if err != nil {

        log.Fatal(err)

    }

}


func GetDB() *PostgreSQLDatabase {

  return db

}


查看完整回答
反對 回復 2023-06-12
  • 3 回答
  • 0 關注
  • 191 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號