go - 从 go-chi 路由处理程序访问数据库实例
问题描述
我正在尝试使用 go-chi 和 Gorm 构建一个 REST API。
我不确定我应该如何将 Gorm 数据库实例传递给路由处理程序。
或者,如果我应该为每个处理程序创建一个实例,这对我来说听起来不合适。
我应该使用中间件、依赖注入还是其他?这里推荐什么模式?
package main
import (
"encoding/json"
"fmt"
"github.com/go-chi/chi/v5"
"log"
"net/http"
"os"
"time"
)
func main() {
r := chi.NewRouter()
r.Get("/", indexHandler)
port := os.Getenv("PORT")
if port == "" {
port = "8080"
log.Printf("Defaulting to port %s", port)
}
db := Connect()
migrations(db)
logStartServer(port)
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%s", port), r))
}
func logStartServer(port string) {
log.Printf("Listening on port %s", port)
log.Printf("Open http://localhost:%s in the browser", port)
}
func indexHandler(w http.ResponseWriter, r *http.Request) {
//How can I access db here?
//result := db.Find(&users)
policy := InsurancePolicy{ValidFrom: time.Now()}
err := json.NewEncoder(w).Encode(policy)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
}
}
解决方案
使用方法而不是函数。这允许您使用这些方法的接收器传递处理程序所需的任何信息:
type MyHandler struct {
DB *gorm.DB
}
func (m MyHandler) IndexHandler(w http.ResponseWriter, r *http.Request) {
// Use m.DB here
}
主要:
handler:=mypkg.MyHandler{DB:gormDB}
r.Get("/", handler.IndexHandler)
在某些情况下,闭包更有意义。
func GetIndexHandler(db *gorm.DB) func(http.ResponseWriter,*http.Request) {
return func(w http.ResponseWriter,req *http.Request) {
// Implement index handler here, using db
}
}
func main() {
...
r.Get("/", GetIndexHandler(db))
推荐阅读
- python - 使用 pybind11 在多线程 C++ 程序中嵌入 Python 解释器
- mysql - 比较两个没有主键的表
- python - 无论出于何种原因,我的代码都没有运行一个段,有人可以帮助我吗?
- reactjs - 无法使用柏树在反应滑块上移动手柄
- javascript - 是否可以根据我当前所在的视图更改 Vue.js 应用程序的元数据,例如标题?
- java - JPA OneToMany - 级联对象和垃圾收集器的迭代
- javascript - 如何使用 Alpine.js 创建动画数字计数器?
- reactjs - 如何在选择输入反应管理员中设置值?
- r - r:为什么在应用 as.Date() 和 origin 时字符串显示日期而不是日期?
- python - 使用 List 切片 Numpy 数组