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.

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

报告相同问题?

悬赏问题

  • ¥20 win11账户锁定时间设为0无法登录
  • ¥45 C#学生成绩管理系统
  • ¥15 VB.NET2022如何生成发布成exe文件
  • ¥30 matlab appdesigner私有函数嵌套整合
  • ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云