gpt4 book ai didi

go - 如何使用 julien schmidt 的路由器避免 Go 中的全局变量?

转载 作者:数据小太阳 更新时间:2023-10-29 03:42:14 25 4
gpt4 key购买 nike

我正在使用 Go 开发 RESTful API,但由于应用配置、身份验证等原因,我有很多全局变量。

由于流行的推荐,我正在使用 Julien Schmidt 的 httprouter,并且正在寻找避免全局变量的可行方法。

这是一些代码。

我正在使用中间件对使用 gorrila/securecookie 的用户进行身份验证。

func AuthMiddleware(handler httprouter.Handle, isLoggedIn bool) httprouter.Handle {
return func(w http.ResponseWriter, r *http.Request, ps httprouter.Params) {if isLoggedIn {
currUser, err := GetCurrentUser(r)

if currUser.Username != "" {
handler(w, r, ps)
return
}

responseWriter(w, false, "User not logged in", nil)
return
}
handler(w, r, ps)
}
}

在此之后,我希望能够在请求转发到的处理程序中使用 currUser 对象,而不是再次调用 GetCurrentUser

func foobar(w http.ResponseWriter, _ *http.Request, _ httprouter.Params) {
var currQuestion CurrQuestions

err = Db.db.Raw("SELECT * FROM users WHERE U.user_id = ?", currUser.UserID).Find(&currQuestion).Error
if err != nil {
responseWriter(w, false, "Internal Server Error", "")
return
}
responseWriter(w, true, "", GameData{})
}

最佳答案

您可以使用上下文包。存储在上下文中的值只能在当前 Controller 中访问。在您的中间件中(最后)执行以下操作:

ctx := context.WithValue(r.Context(), "User", user)
r = r.WithContext(ctx)
handler(w, r, ps)

现在您可以在处理程序中获取此值:

user, ok := r.Context().Value("User").(<type of your user struct>)

字符串“User”是用来保存值的键。您可以随意更改它,但 const 是个好主意。

如果 oktrue,则用户已被提取并且是正确的类型。如果 okfalse,则用户未设置或类型错误。

关于go - 如何使用 julien schmidt 的路由器避免 Go 中的全局变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49180023/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com