Gorilla Mux 和 GORM 失败

Posted

技术标签:

【中文标题】Gorilla Mux 和 GORM 失败【英文标题】:Gorilla Mux and GORM fail 【发布时间】:2018-04-26 18:16:49 【问题描述】:

我关注了this tutorial,了解如何使用 PostgreSQL、Gorilla Mux 和 GORM 设置基本 API。

这是我的应用程序:

package main

import (
    "encoding/json"
    "net/http"

    "github.com/gorilla/mux"
    "github.com/jinzhu/gorm"
    _ "github.com/jinzhu/gorm/dialects/postgres"
)

var db *gorm.DB


type Ticket struct 
    gorm.Model
    InfoHash string
    Status   *int `gorm:"default:'0'"`



func main() 
    router := mux.NewRouter()

    db, err := gorm.Open("postgres", "host=localhost user=user dbname=db_development password=password sslmode=disable")
    db.LogMode(true)

    if err != nil 
        panic(err)
    
    defer db.Close()

    db.AutoMigrate(&Ticket)

    router.HandleFunc("/", TicketsIndex).Methods("GET")

    http.ListenAndServe(":3000", router)


func TicketsIndex(w http.ResponseWriter, r *http.Request) 
    tickets := []Ticket
    db.Find(&tickets)
    json.NewEncoder(w).Encode(&tickets)

问题是当我访问localhost:3000 时,服务器只是停止而没有错误日志,只是停止并退出应用程序。它应该以 JSON 格式返回存储在数据库中的票证。

如果我在我的 TicketsIndex 函数中打开数据库并关闭它,我就可以正常工作,如下所示:

func TicketsIndex(w http.ResponseWriter, r *http.Request) 
  db, err := gorm.Open("postgres", "host=localhost user=user dbname=db_development password=password sslmode=disable")
  tickets := []Ticket
  db.Find(&tickets)
  json.NewEncoder(w).Encode(&tickets)
  defer db.Close()

但我认为这不是正确的方法。我也尝试将此代码移动到主函数中并且也可以:

tickets := []Ticket
db.Find(&tickets)

所以我假设它可能是未正确分配的全局变量var db *gormDB。我做错了什么?

【问题讨论】:

当您输入db, err := 时,您将使用名为db 的函数局部变量遮蔽全局var db,而不是分配给全局变量。您需要使用等号分配给已定义的 var。也意味着你需要在main 范围内写var err error 这就是我的朋友的答案,从昨天开始我一直在努力解决这个问题。写下你的答案让我接受。谢谢! 【参考方案1】:

当您键入db, err := ... 时,您实际上是在使用名为db 的函数局部变量来隐藏全局var db,而不是分配给全局变量。您需要使用等号(= vs :=)分配给已定义的变量。这也意味着您需要在分配之前在主范围内编写var err error,因为您不再自动从:= 获得声明。

【讨论】:

以上是关于Gorilla Mux 和 GORM 失败的主要内容,如果未能解决你的问题,请参考以下文章

GolangWeb 入门 08 集成 Gorilla Mux

GolangWeb 入门 08 集成 Gorilla Mux

我应该如何用 gorilla/mux 解决这个导入问题?

gorilla/mux 的学习

Gorilla mux 可选查询值

使用 Gorilla MUX 和 Negroni 子路由中间件