Go 如何将参数传递到我的身份验证中间件以获得db访问权限

Go 如何将参数传递到我的身份验证中间件以获得db访问权限,go,Go,在我的AuthMw中间件中,我想进行数据库调用 我的数据库变量已在main中初始化,如何将其传递给我的中间件AuthMw? func main() { db, err := gorm.Open("postgres", ... ) r := mux.NewRouter() r.Handle("/ws", serveWebsocket(hub)) r.Use(AuthMw) // // ... } // main func AuthMw

在我的AuthMw中间件中,我想进行数据库调用

我的数据库变量已在main中初始化,如何将其传递给我的中间件AuthMw?

func main() {
    db, err := gorm.Open("postgres", ... )
    r := mux.NewRouter()
    r.Handle("/ws", serveWebsocket(hub))
    r.Use(AuthMw)

    //
    //
    ...

} // main


func AuthMw(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        token := r.URL.Query().Get("token")
        fmt.Printf("AuthMiddleware token is: %v\n", token)

        ctx := ....

        next.ServeHTTP(w, r.WithContext(ctx))
    })
}

您有两个不涉及全局变量的直接选项

使用闭包 您可以将
AuthMw
重新写入:

func AuthMw(db *DbType) (func (next http.Handler) http.Handler) {
    return func (next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            // Your code goes here, now with a pointer to db
        })
    }
}
这样,您就创建了一个“工厂函数”,返回一个新的
http.Handler
decorator,在这里您的
db
变量可以通过闭包访问

在此之后,您只需将
r.Use(AuthMw)
替换为
r.Use(AuthMw(db))

这可能有点过于依赖嵌套方法,所以我建议

使用结构 将
AuthMw
转换为结构,并将装饰器作为方法附加:

type AuthMw struct {
  db *DbType
}

func NewAuthMw(db *DbType) AuthMw {
  return AuthMw{db}
}

func (a *AuthMw) Decorator(next http.Handler) http.Handler {
    // Your code, now with a pointer to db, goes here
}

然后您只需将
r.Use(AuthMw)
替换为
r.Use(authMwVariable.Decorator)

db
变量设置为全局变量,这样就可以在main外部访问它。您可能想调查一下: