处理表单提交后提供页面时出现空白页或运行时错误

时间:2014-08-24 18:33:24

标签: go web-frameworks

我可以加载一个html页面(index.html),其中<body></body>内容如下所示:

<form action="ask" method="get">
    <input type="text" name="q" />
</form>

我想要的是渲染index.html然后在提交问题时渲染index.html的副本,除了一些内容来自我的golang代码作为结果页面。

当我在index.html中提交表单时,我会得到一个空白页。

但是当我转到localhost:8000 / view或时,我没有收到任何数据 localhost:8000 / view?q =浏览器中的hello + world。在终端,我得到了这个以及更多,但这是第一行:

http:panic serving [:: 1]:53803:运行时错误:无效的内存地址或无指针取消引用

这是什么意思,我该如何解决?

当我去/询问或/问?q = hello + world,这就是我想要做的,我得到的空白页没有错误。

我正在尝试处理已加载的初始页面上的问题,并在提交表格提交后在结果页面上处理。

index.html,view.html和edit.html都有:

<form method="get" action="ask">

    <input type="text" name="q" />

</form>

现在是我的代码:

package main

import (

    "fmt"
    "net/http"
    "github.com/zenazn/goji"
    "github.com/zenazn/goji/web"

    "html/template"
    "io/ioutil"
)

type Page struct {

    Title string

    Body []byte

}

func (p *Page) save() error{

    filename := p.Title + ".txt"

    return ioutil.WriteFile(filename, p.Body, 0600) 

}

func loadPage(title string) (*Page, error){

    filename := title + ".txt"

    body, err := ioutil.ReadFile(filename)

    if err != nil{

        return nil, err

    }

    return &Page{Title: title, Body: body}, nil 

}

func renderTemplate(w http.ResponseWriter, tmpl string, p *Page){

    t, err := template.ParseFiles(tmpl + ".html")

    if err != nil{
        fmt.Println(err)
    }
    t.Execute(w, p)

}

func viewHandler(w http.ResponseWriter, r *http.Request){

    //title := r.URL.Path[len("/view/"):]

    title := r.FormValue("q")

    p, err := loadPage(title)

    if err != nil{
        fmt.Println(err)
    }

    renderTemplate(w, "view", p)

}

func editHandler(w http.ResponseWriter, r *http.Request){

    //title := r.URL.Path[len("/edit/"):]

    title := r.FormValue("q")

    p, err := loadPage(title)

    if err != nil{

        p = &Page{Title: title}
        fmt.Println(err)

    }

    renderTemplate(w, "edit", p)

}

func response(c web.C, w http.ResponseWriter, r *http.Request){

}

func serveSingle(filename string) func(w http.ResponseWriter, r *http.Request) {

    return func(w http.ResponseWriter, r *http.Request) {

        http.ServeFile(w, r, filename)

    }

}

func main() {

    goji.Get("/", serveSingle("Projects/Go/src/web/site/index.html"))

    goji.Handle("/ask", response)

    http.HandleFunc("/view/", viewHandler)

    http.HandleFunc("/edit/", editHandler)

    goji.Serve()

}

所以我想处理来自index.html和结果页面的问题并运行响应,这将在index.html和结果页面上提交问表单时呈现结果页面。

1 个答案:

答案 0 :(得分:0)

使用正确的错误处理,您应该看到发生了什么。由于某种原因,它要么加载空白文件,要么无法找到文件,这就是结果页面为空白的原因。

如评论中所述:

在renderTemplate中,执行panic(err)并检查t.Execute()的返回值。在viewHandler中也执行panic(err)。在editHandler中也一样,执行panic(err)

看看那些恐慌说什么并从那里开始。