第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

Go
米脂 2023-06-12 14:19:01
我是Golang的新手,需要一些幫助。我正在嘗試創(chuàng)建沒有 ORM 的 REST API Web 服務(wù)?,F(xiàn)在我已成功連接到PostgreSQL數(shù)據(jù)庫。在數(shù)據(jù)庫中,我有一個名為factors. 我想創(chuàng)建 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 回答

?
慕標(biāo)5832272

TA貢獻(xiàn)1966條經(jīng)驗 獲得超4個贊

我喜歡使用的一種模式是定義您自己的Router結(jié)構(gòu),該結(jié)構(gòu)具有一個mux.Router字段,并封裝諸如您的數(shù)據(jù)庫連接、應(yīng)用程序配置等內(nèi)容。


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


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


路由器.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你可以簡單地創(chuàng)建你的自定義路由器,將它傳遞給你的數(shù)據(jù)庫連接。然后自定義路由器可以直接傳遞給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))

}

希望這會有所幫助。


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

TA貢獻(xiàn)1900條經(jīng)驗 獲得超5個贊

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


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


主程序

// ... 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

  })

}

另外一個選擇:


我不太確定這一點,但你可以根據(jù)你的需要調(diào)整它。初始化一個Controller結(jié)構(gòu)并將數(shù)據(jù)庫傳遞給它:


主程序

// ... 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 結(jié)構(gòu)上的方法。在控制器中定義一個結(jié)構(gòu)


控制器/factors.go

type Controller struct {

  DB *PostgreSQLDatabase

}


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

    // some code

    // c.DB.MySqlMethod()

}


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

TA貢獻(xiàn)1862條經(jīng)驗 獲得超7個贊

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


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

在主文件中你必須有:


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

為了獲得數(shù)據(jù)庫連接,你必須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

}


查看完整回答
反對 回復(fù) 2023-06-12
  • 3 回答
  • 0 關(guān)注
  • 188 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號