无法将mysql数据绑定到golang中的html模板

Posted

技术标签:

【中文标题】无法将mysql数据绑定到golang中的html模板【英文标题】:Cannot bind mysql data to html template in golang 【发布时间】:2022-01-16 01:26:48 【问题描述】:

更新:任何地方都没有错误!在浏览器中,控制台或网络选项卡中没有错误。在运行 go 代码的终端中,也没有错误。 go中的所有错误都会被记录;为简洁起见,我删除了问题中的错误处理。

正在尝试阅读一本关于使用 Go 编写 Web 应用程序的书。 我有一个本地 mysql 数据库,我可以使用 database/sql 包获取数据。我正在使用html/template 包解析模板,但不知何故无法将数据绑定到模板中。

这是模型:

type Snippet struct 
    ID      int
    Title   string
    Content string
    Created time.Time
    Expires time.Time

这是用于显示数据的handler(省略了错误处理):

func (app *application) showSnippet(w http.ResponseWriter, r *http.Request) 
    id, _ := strconv.Atoi(r.URL.Query().Get("id"))
    s, _ := app.snippets.Get(id) // get data from database!
    files := []string
        "./ui/html/show.page.tmpl", // this is the template.
        "./ui/html/base.layout.tmpl",
        "./ui/html/footer.partial.tmpl", // either relative or absolute path!
    
    ts, _ := template.ParseFiles(files...)
    _ = ts.Execute(w, s) // write the template set content as the response body; 
    
    // NOTE: this does print out data fine so data is indeed retrieved from the db.
    fmt.Fprintf(w, "%s\n%s", s.Title, s.Content) 

这是show.page.tmpl 模板:

template "base" .
define "title"Snippet #.IDend
define "main"
<div class='snippet'>
    <div class='metadata'>
        <strong>.Title</strong>
        <span>#.ID</span>
    </div>
    <pre><code>.Content</code></pre>
    <div class='metadata'>
        <time>Created: .Created</time>
        <time>Expires: .Expires</time>
    </div>
</div>
end

在页面上,它不显示数据,因为它是空的;但调试行在底部打印得很好。 出了什么问题?

【问题讨论】:

@CeriseLimón 在问题中,为简洁起见省略了错误处理;实际上,来自ts.Execute(w, s) 的错误是使用集中式错误处理记录的。 @CeriseLimón 抱歉,但没有任何地方出现错误。在浏览器中,没有错误,在终端中,没有错误。我根本看不到任何错误。如您所见,调试消息打印在最后一行,如果在此之前有任何错误,它会显示在某个地方。 见this example。该模板是独立工作的。发布minimal reproducible example。 【参考方案1】:

在 HTTP 处理程序中编译模板不是一个好主意(基本上在每个请求中)

假设您使用模板名称和 .htm 扩展名创建了文件,您可以这样做(甚至将它们添加到应用程序结构中)

// Define a global templates variable (or add it to the application if you want)
var templates *template.Template
// For compiling the templates
// in a subdirectory called "templates" with files ending in .htm
func getTemplates() (templates *template.Template, err error) 
    var allFiles []string
    templateDir := "templates"
    files2, _ := ioutil.ReadDir(templateDir)
    for _, file := range files2 
        filename := file.Name()
        if strings.HasSuffix(filename, ".htm") 
            filePath := filepath.Join(templateDir, filename)
            allFiles = append(allFiles, filePath)
        
    
    templates, err = template.New("").ParseFiles(allFiles...)
    LogPanic(err, "Error building templates")
    return

// load them on init
func init() 
    var err error
    templates, err = getTemplates()
    if err != nil 
        log.Panicf("%s: %s \n", "ERROR compiling templates", err)
    

现在您已经编译了模板,您可以在 HTTP 处理程序中执行它们,如果有任何错误,请记录错误(如果您看到 Cerise Limón 建议的任何错误,请分享)记得更新代码中的模板名称。

func (app *application) showSnippet(w http.ResponseWriter, r *http.Request) 
    id, _ := strconv.Atoi(r.URL.Query().Get("id"))
    s, _ := app.snippets.Get(id)
    err := templates.ExecuteTemplate(w, "template_name", s)
    if err != nil 
        log.Printf("%s: %s \n", "ERROR executing template", err)
    
    fmt.Fprintf(w, "%s\n%s", s.Title, s.Content) 

【讨论】:

以上是关于无法将mysql数据绑定到golang中的html模板的主要内容,如果未能解决你的问题,请参考以下文章

golang 显示无法将数据附加到gob文件 - 当尝试解码写入的数据时,解码器将使用“缓冲区中的额外数据”错误输出

无法将范围变量绑定到角度js中的html元素

无法将 html 表数据绑定到 mvc 控制器模型

Golang 入门系列 mysql数据库的使用

使用 web api 编辑获取数据时无法将数据绑定到 jqgrid 中的下拉列表

只有ECS时无法连接Golang中的RDS mysql