3 回答
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))
}
希望这会有所帮助。
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()
}
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
}
- 3 回答
- 0 关注
- 132 浏览
添加回答
举报