2016-08-29 11 views
0

This私の質問に答えるかのように表示されますが、出力を「somefile.json」(「deck.json」という名前) "私のコードで)何をしようとしている。私の推測では、誤った時刻にファイルがオープン/クローズされているため、フォーム入力とライターがお互いに行方不明になっていると思いますが、私は正直には分かりません。この例を、ユーザーが別のページに格納されているJavaScriptで動作する「フラッシュカード」アプリケーションによって参照されるJSONファイルに保存する用語と定義を入力できる形式にしています。ここでHTMLフォームの入力をJSONにマーシャリングしてファイルに書き込む、golang

この時点で私が持っているコードです:

HTML:

<html> 
<head> 
     <meta charset="utf-8"> 
     <title>Flashcards for Learning JS</title> 
</head> 
<body> 
    <br> 
<form action="/addcard" method="post"> 
    <input type="text" name="term" placeholder="Term"> 
    <br> 
    <br> 
    <input type="text" name="definition" placeholder="Definition"> 
    <br> 
    <br> 
    <input type="submit" value="Add Card"> 
</form> 
</body> 
</html> 

GO:@JimBの勧告ごとに変更

package main 

import (
    "encoding/json" 
    "html/template" 
    "net/http" 
    "os" 
) 

type Card struct { 
    Term  string `json:"term"` 
    Definition string `json:"definition"` 
} 

func open(w http.ResponseWriter, r *http.Request) { 
    t, _ := template.ParseFiles("Form.html") 
    t.Execute(w, nil) 
} 

func addcard(w http.ResponseWriter, r *http.Request) { 
    f, err := os.Open("deck.json") 
    if err != nil { 
     http.Error(w, err.Error(), 500) 
     return 
    } 

    card := new(Card) 
    card.Term = r.FormValue("term") 
    card.Definition = r.FormValue("definition") 

    b, err := json.Marshal(card) 
    if err != nil { 
     http.Error(w, err.Error(), 500) 
     return 
    } 

    f.Write(b) 
    f.Close() 
} 

func main() { 
    http.HandleFunc("/", open) 
    http.ListenAndServe(":8080", nil) 
    http.HandleFunc("/addcard", addcard) 
} 
+0

あなたは 'f.Write'からエラーをチェックしていない、常にエラーを確認してください。ファイルは読み取り専用です。 – JimB

+0

残念ながら、何かが私にファイルのアクセス許可をエスケープしない限り、そうは思われません。 "deck.json"のアクセス権は現在、すべてのユーザーが読み書き/実行できるように設定されています。 – minauteur

+0

いいえ、その場合は、 'Write'のエラーをチェックしてください。あなたはO_RDONLYでファイルを開いています:https://golang.org/pkg/os/#Open – JimB

答えて

0

。ハンドラの順序を修正し、プログラムはそれぞれの連続したサブミッションを有効なJSONとして問題のファイルに連結します。

HTML:

<html> 
<head> 
     <meta charset="utf-8"> 
     <title>Flashcards for Learning JS</title> 
</head> 
<body> 
    <br> 
<form action="/addcard" method="post"> 
    <input type="text" name="term" placeholder="Term"> 
    <br> 
    <br> 
    <input type="text" name="definition" placeholder="Definition"> 
    <br> 
    <br> 
    <input type="submit" value="Add Card"> 
</form> 
</body> 
</html> 

GO:

package main 

import (
    "encoding/json" 
    "html/template" 
    "net/http" 
    "os" 
) 

type Card struct { //defining the data structure for our virtual flashcards 
    Term  string `json:"Term"` 
    Definition string `json:"Definition"` 
} 

func open(w http.ResponseWriter, r *http.Request) { 
    t, _ := template.ParseFiles("addcard.html") 
    t.Execute(w, nil) 
} 

func addcard(w http.ResponseWriter, r *http.Request) { 
    f, err := os.OpenFile("deck.json", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666) 
    if err != nil { 
     http.Error(w, err.Error(), 500) 
     return 
    } 
    defer f.Close() 

    card := new(Card) 
    card.Term = r.FormValue("term") 
    card.Definition = r.FormValue("definition") 

    b, err := json.Marshal(card) 
    if err != nil { 
     http.Error(w, err.Error(), 500) 
     return 
    } 

    f.Write(b) 
    f.Close() 
} 

func main() { 
    http.HandleFunc("/addcard", addcard) 
    http.HandleFunc("/", open) 
    http.ListenAndServe(":8080", nil) 

} 
関連する問題