Go 如何将参数传递到我的身份验证中间件以获得db访问权限
在我的AuthMw中间件中,我想进行数据库调用 我的数据库变量已在main中初始化,如何将其传递给我的中间件AuthMw?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
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外部访问它。您可能想调查一下: