簡體   English   中英

多個響應.WriteHeader調用

[英]Multiple response.WriteHeader calls

我是新手,很難重新模板。

這是我要生成模板的功能:

base.html文件

//Render templates for the given name, template definition and data object
func renderTemplate(w http.ResponseWriter, name string, template string, viewModel interface{}) {
    // Ensure the template exists in the map.
    tmpl, ok := templates[name]
    if !ok {
        http.Error(w, "The template does not exist.", http.StatusInternalServerError)
    }
    err := tmpl.ExecuteTemplate(w, template, viewModel)
    if err != nil {
    log.Printf("temlate error here")
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}


 func EditNote(w http.ResponseWriter, r *http.Request) {
    //var viewModel models.EditChnl
    vars := mux.Vars(r)
    //ch := bson.M{"id": "Ale"}
    title := vars["title"]
    log.Printf("%v\n", title)
    session, err := mgo.Dial("localhost")
    if err != nil {
      panic(err)
    }
        defer session.Close()
        session.SetMode(mgo.Monotonic, true)
        c := session.DB("tlgdb").C("chnls")
        log.Printf("title is %s \n", title)
        var result  []models.Chnl
        err = c.Find(bson.M{"title": "xxx"}).All(&result)
        log.Printf("%v\n", result)

        if err != nil {
          log.Printf("doc not found")
          log.Fatal(err)
          return
        }
    renderTemplate(w, "edit", "base", result)
}

這是模板:

{{define "base"}}
<html>
  <head>
    {{template "head" .}}
  </head>
  <body>

    {{template "body" .}}

  </body>
</html>
{{end}}

edit.thml

{{define "head"}}<title>Edit Note</title>{{end}}
{{define "body"}}
<h1>Edit Note</h1>
<form action="/chnls/update/{{.Title}}" method="post">
<p>Title:<br> <input type="text" value="{{.Title}}" name="title"></p>
<p>Description:<br> <textarea rows="4" cols="50" name="description">{{.Description}}</textarea> </p>
<p><input type="submit" value="submit"/></p>
</form>
{{end}}

要渲染的對象是:

type Chnl struct {
    Id    bson.ObjectId `json:"id"  bson:"_id,omitempty"`
    Title       string
    Description string
    CreatedOn   time.Time
    Creator     string
    Visits  int
    Score       int
}

我要渲染的對象存在於mongodb中,可以在控制台中將其打印出來:

[{ObjectIdHex("56cc4493bc54f4245cb4d36b") sometitle blabla 2016-02-23 12:37:55.972 +0100 CET blabla 0 0}]

但是我得到這個錯誤:

temlate error here
http: multiple response.WriteHeader calls

我想知道這里有什么問題以及如何解決?

根本問題是您將Chnl傳遞給模板:

var result  []models.Chnl
// ...
renderTemplate(w, "edit", "base", result)

而且里面renderTemplate()的參數值的方式viewModel將是result

在模板中,您引用點的字段,例如它是否為Chnl值而不是其一部分: {{.Title}} 因此,首次嘗試解決該問題將失敗。

記錄錯誤非常有用,因此請更改記錄以打印實際錯誤,而不僅僅是一般錯誤:

log.Printf("Temlate error here: %v", err)

結果是:

2016/02/24 14:57:09此處出現Temlate錯誤:模板:edit.html:4:30:在<.Title>處執行“ body”:無法評估類型為[] main.Chnl的字段Title

我認為您只想傳遞1 Chnl值,而不是其中的一小部分。 EditNote()

if len(result) > 0 {
    renderTemplate(w, "edit", "base", result[0])
}

接下來,知道http.Error()將內容寫入響應。 這意味着您無法將更多的標頭值寫入響應。 通常,當您在處理程序中調用http.Error()時,應該不做任何響應就返回:

if !ok {
    http.Error(w, "The template does not exist.", http.StatusInternalServerError)
    return // NOTE THIS RETURN
}

同樣,在所有http.Error()調用之后,插入return 您可以進行一些清理,但是不應在http.Error()之后觸及響應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM