go - 无法使用 Golang 从带有 mySQL 后端的 gorilla / session 中获取值(value)

标签 go gorilla

我试图在使用 mySQL 后端的 gorilla session 中为我的模型保存一个结构,但当我尝试检索它时,venueID 只得到 0。我可以毫不费力地保存和获取即显消息。我的目标是在 session 中保存模型结构并检索它以获取编辑、更新和删除功能中的 ID 号。

这是我的代码:

type appResource struct {
    tmpl  *template.Template // net/http
    store *mysqlstore.MySQLStore
    db    *sql.DB // database/sql
}

// newAppResource function to pass global var
func newAppResource(store *mysqlstore.MySQLStore, db *sql.DB, tmpl *template.Template) *appResource {
    return &appResource{
        store: store,
        db:    db,
        tmpl:  tmpl,
    }
}

func main() {

sessionKey := os.Getenv("sessionKey")

    endpoint := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?parseTime=true&loc=Local", dbUser, dbPass, dbHost, dbPort, dbName)
    tableName := "sessions"
    path := "/"
    maxAge := 3600
    codecs := []byte(sessionKey)

    store, err := mysqlstore.NewMySQLStore(endpoint, tableName, path, maxAge, codecs)
    if err != nil {
        log.Println("SESSIONS STORE error")
        log.Fatal(err)
....
    }

}


type Venue struct {
    VenueID int
    Name    string
    Email   string
    Phone   string
    Active  bool
}

// VenueData template variable for show and edit
type VenueData struct {
    Venue   Venue
    Flashes []interface{}
}

func (rs *appResource) venuesShow(w http.ResponseWriter, r *http.Request) {

    var venue Venue

    var data VenueData

    id := r.URL.Query().Get("id")

    venueID, err := strconv.Atoi(id)
    if err != nil {
        log.Println("show venue ID not > 0")
        http.Redirect(w, r, "/login", http.StatusUnauthorized)
        return
    }

    if !(venueID > 0) {
        log.Println("update venue ID not > 0")
        http.Redirect(w, r, "/login", http.StatusUnauthorized)
        return
    }

    query, err := rs.db.Query("SELECT id, name, email, phone, active FROM Venues WHERE id=?", venueID)
    if err != nil {
        log.Fatal(err)
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    for query.Next() {

        err = query.Scan(&venue.VenueID, &venue.Name, &venue.Email, &venue.Phone, &venue.Active)
        if err != nil {
            log.Fatal(err)
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
    }

    data.Venue = venue

    session, err := rs.store.Get(r, "admin-data")
    if err != nil {
        log.Fatal(err)
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    log.Println(venue.VenueID)

    if flashes := session.Flashes(); len(flashes) > 0 {
        for _, message := range flashes {
            data.Flashes = append(data.Flashes, message)
        }
    }

    session.Values["venue"] = venue

    session.Save(r, w)
    if err != nil {
        log.Fatal(err)
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    if err := rs.tmpl.ExecuteTemplate(w, "venues-show", data); err != nil {
        log.Fatal(err)
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}


func (rs *appResource) venuesEdit(w http.ResponseWriter, r *http.Request) {

    var data VenueData

    session, err := rs.store.Get(r, "admin-data")
    if err != nil {
        log.Fatal(err)
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    venue := getVenue(session)

    venueID := venue.VenueID

    query, err := rs.db.Query("SELECT id, name, email, phone, active FROM Venues WHERE id=?", venueID)
    if err != nil {
        log.Fatal(err)
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }

    for query.Next() {

        err = query.Scan(&venueID, &venue.Name, &venue.Email, &venue.Phone, &venue.Active)
        if err != nil {
            log.Fatal(err)
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }

        data.Venue = venue
    }

    if err := rs.tmpl.ExecuteTemplate(w, "venues-edit", data); err != nil {
        log.Fatal(err)
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}


func getVenue(s *sessions.Session) Venue {
    val := s.Values["venue"]
    var venue = Venue{}
    venue, ok := val.(Venue)
    if !ok {
        log.Println("no venue found")
        return Venue{}
    }
    return venue
}

最佳答案

事实证明,我需要注册一个结构才能在 Gorilla session 中使用它。

import (
"encoding/gob"
)

func main() {
 gob.Register(Venue{})
}

关于go - 无法使用 Golang 从带有 mySQL 后端的 gorilla / session 中获取值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54721493/

相关文章:

gorilla 多路复用器排除扩展请求

Golang kubernetes go-client 将 Deployment 转换到 DeploymentList

postgresql - 为 postgres 运行多个查询(SELECT * from emp; Select * from adm;) 并在两个不同的结构中得到结果 IN GO(GOLANG)

go - 如何使用“github.com/gorilla/websocket”检查websocket连接是否处于就绪状态

angularjs - FileServe和Routing的配合更流畅

Golang Gorilla CEX.IO Websocket 认证错误

api - 尝试查询 API,但 api 响应为空

Go: "instance"在此 block 中重新声明

shell - 使用go获取 shell 名称

Gorilla mux 调用不正确的处理程序?