やりたいこと
Goの勉強でTodoアプリを作成しています。
ReactでPOSTリクエストしたデータをGoで読み込みたいです。
実装
Go サーバーサイド
Go
1コード 2package todos 3 4import ( 5 "database/sql" 6 "encoding/json" 7 "fmt" 8 "io/ioutil" 9 "log" 10 "net/http" 11 "os" 12 "strings" 13 "time" 14 "todo-app/auth" 15 16 "github.com/joho/godotenv" 17) 18 19type Todo struct { 20 // UserID int `json:"userid"` 21 Todo string `json:"todo"` 22 CreatedAt time.Time `json:"createdat"` 23 UpdatedAt time.Time `json:"updatedat"` 24} 25 26type TodoBody struct { 27 Todo string `json:"todo"` 28} 29 30func CreateTodo(w http.ResponseWriter, r *http.Request) { 31 w.Header().Set("Content-Type", "*") 32 w.Header().Set("Access-Control-Allow-Origin", "http://localhost:3000") 33 w.Header().Set("Access-Control-Allow-Credentials", "true") 34 w.Header().Set("Access-Control-Allow-Headers", "*") 35 36 e := godotenv.Load() 37 if e != nil { 38 log.Fatal(e) 39 } 40 dbConnectionInfo := fmt.Sprintf("%s:%s@tcp(127.0.0.1:3306)/go_todo", os.Getenv("DB_USER"), os.Getenv("DB_PASSWORD")) 41 db, err := sql.Open("mysql", dbConnectionInfo) 42 if err != nil { 43 log.Fatal(err) 44 } 45 defer db.Close() 46 47 body, err := ioutil.ReadAll(r.Body) 48 if err != nil { 49 log.Fatal(err) 50 51 } 52 53 log.Printf("request body=%s\n", body) 54 55 var data TodoBody 56 57 if err := json.Unmarshal(body, &data); err != nil { 58 log.Println(err) 59 } 60 61 // userId := 12 62 todo := data.Todo 63 64 todoData := Todo{todo, time.Now(), time.Now()} 65 66 tokenString := r.Header.Get("Authorization") 67 tokenString = strings.TrimPrefix(tokenString, "Bearer ") 68 69 log.Printf("request token=%s\n", tokenString) 70 71 _, err2 := auth.TokenVerify(tokenString) 72 if err2 != nil { 73 log.Fatal(err) 74 } else { 75 76 stmt, err := db.Prepare("INSERT INTO todos (Todo,CreatedAt,UpdatedAt) VALUES(?,?,?)") 77 if err != nil { 78 log.Fatal(err) 79 } 80 81 _, err = stmt.Exec(todoData.Todo, todoData.CreatedAt, todoData.UpdatedAt) 82 if err != nil { 83 log.Fatal(err) 84 } 85 86 json.NewEncoder(w).Encode(todoData) 87 } 88} 89
React フロントエンド
React
1import { useState } from "react"; 2import { useCreateTodo } from "../../hooks/useCreateTodo"; 3import { BaseButton } from "../atoms/baseButton"; 4import { TextArea } from "../atoms/textArea"; 5 6export const AddTodo = () => { 7 const [text, setText] = useState(""); 8 const CreateTodo = useCreateTodo(); 9 const token = "Bearer " + sessionStorage.getItem("token"); 10 11 const onClickCreate = () => { 12 CreateTodo(token, text); 13 }; 14 15 return ( 16 <div> 17 <TextArea 18 onChange={(e: any) => setText(e.target.value)} 19 defaultValue="" 20 /> 21 22 <BaseButton text="タスクを追加" onClick={onClickCreate} /> 23 </div> 24 ); 25}; 26
ここでPOSTしています↓
React
1import axios from "axios"; 2 3export const useCreateTodo = () => { 4 const URL = "http://127.0.0.1:8080/createtodo"; 5 6 const CreateTodo = async (token: string, todo: any) => { 7 const data = { todo: todo }; 8 console.log(data); 9 10 await axios 11 .post(URL, JSON.stringify(data), { headers: { Authorization: token } }) 12 .then((res) => console.log(res)) 13 .catch((err) => console.log(err)); 14 }; 15 16 return CreateTodo; 17}; 18
POSTする際にheaderをつけなければGoのioutil.ReadAll(r.Body)に正しい値が来ていますが、headerを加えると値がとれなくなります。
Advanced REST clientでGoのAPIをたたいた際にはheaderの情報があっても正しく処理されているので、POSTの仕方に問題があるかと考えていますが、なかなか解決することができません。ブラウザのコンソールにはこちらが表示されています。 POST http://127.0.0.1:8080/createtodo net::ERR_CONNECTION_RESET
お力を貸していただけたら幸いです。よろしくお願いします。

回答1件
あなたの回答
tips
プレビュー