dougan0529 2018-03-08 18:26
浏览 45
已采纳

如何使用Julien Schmidt的路由器避免Go中的全局变量?

I am developing a RESTful API with Go but owing to app configuration, authentication etc I have quite a few global variables.

I am using Julien Schmidt's httprouter because of popular recommendation and am looking for a feasible way to avoid global variables.

Here is some of the code.

I am using a middleware for authenticating a user using 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)
    }
}

After this, I want to be able to use the currUser object inside the handler that the request is forwarded to such as this one instead of calling GetCurrentUser once again

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{})
}
  • 写回答

1条回答 默认 最新

  • duanju8431 2018-03-10 13:21
    关注

    You can use the context package. Values stored in context are only accessible in the current controller. In your middleware (at the end) do the following:

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

    Now you can fetch this value in you handler:

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

    The string "User" is the key that is used to save the value. You can change it any way you like, but a const is a good idea.

    if ok is true, the user has been fetched and is the correct type. If ok is false, the user was not set or it has the wrong type.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 爬取网页信息并保存需要完整代码
  • ¥15 一分十不等功分器阻设计问题,请问这个56Ω怎么得到的
  • ¥15 (标签-matlab)
  • ¥100 求看看这个数学建模,有偿
  • ¥15 深度学习目标检测现在框架加注意力的创新可以投几区?
  • ¥15 PdfiumViewer pdf转图片
  • ¥15 利用Java连接API接口总是出问题
  • ¥15 请教一个关于镜头标定,棋盘格格子大小的问题(畸变测试)
  • ¥15 安装GroudingDINO RuntimeError: Error compiling objects for extension
  • ¥15 急!C++指针编写相关的问题