回答編集履歴

7

コード修正

2019/02/17 00:18

投稿

teikoku-penguin
teikoku-penguin

スコア314

test CHANGED
@@ -484,11 +484,11 @@
484
484
 
485
485
 
486
486
 
487
- // JSONのパース
487
+ // リクエストのパース(JSONから値を抜き出す)
488
-
489
-
490
-
488
+
489
+
490
+
491
- // データベースの操作
491
+ // データベースの操作(書き込みとか)
492
492
 
493
493
  }
494
494
 

6

追記

2019/02/17 00:18

投稿

teikoku-penguin
teikoku-penguin

スコア314

test CHANGED
@@ -353,3 +353,143 @@
353
353
  }
354
354
 
355
355
  ```
356
+
357
+
358
+
359
+ # 2/17追記 2
360
+
361
+ postgresの環境を作るのが面倒なので検証していませんがDBアクセスに必要な前準備の部分だけ作ってみました
362
+
363
+ これを元に必要な処理の追加などやってみてはいかがでしょうか?
364
+
365
+ ちなみにdbのポートはサーバーポートと同じではダメです。
366
+
367
+
368
+
369
+ ```Go
370
+
371
+ // main.go
372
+
373
+
374
+
375
+ package main
376
+
377
+
378
+
379
+ import (
380
+
381
+ "github.com/yourname/projectname/controller"
382
+
383
+ "log"
384
+
385
+ "net/http"
386
+
387
+ )
388
+
389
+
390
+
391
+ func main() {
392
+
393
+ mux := http.NewServeMux()
394
+
395
+
396
+
397
+ controller.NewRouter(mux)
398
+
399
+ log.Fatal(http.ListenAndServe(":8080", mux))
400
+
401
+ }
402
+
403
+ ```
404
+
405
+
406
+
407
+ ```Go
408
+
409
+ // router.go
410
+
411
+
412
+
413
+ package controller
414
+
415
+
416
+
417
+ import (
418
+
419
+ "net/http"
420
+
421
+ )
422
+
423
+
424
+
425
+ func NewRouter(mux *http.ServeMux) {
426
+
427
+ mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
428
+
429
+ w.WriteHeader(200)
430
+
431
+ w.Write([]byte("Index"))
432
+
433
+ })
434
+
435
+
436
+
437
+ mux.HandleFunc("/room/new", NewRoom)
438
+
439
+ }
440
+
441
+ ```
442
+
443
+
444
+
445
+ ```Go
446
+
447
+ // room.go
448
+
449
+
450
+
451
+ package controller
452
+
453
+
454
+
455
+ import (
456
+
457
+ _ "github.com/lib/pq"
458
+
459
+
460
+
461
+ "database/sql"
462
+
463
+ "net/http"
464
+
465
+ )
466
+
467
+
468
+
469
+ func NewRoom(w http.ResponseWriter, r *http.Request) {
470
+
471
+ db, err := sql.Open("postgres", "host=127.0.0.1 port=5555 user=user password=pw dbname=database")
472
+
473
+
474
+
475
+ defer db.Close()
476
+
477
+
478
+
479
+ if err != nil {
480
+
481
+ http.Error(w, err.Error(), 500)
482
+
483
+ }
484
+
485
+
486
+
487
+ // JSONのパース
488
+
489
+
490
+
491
+ // データベースへの操作
492
+
493
+ }
494
+
495
+ ```

5

コード修正

2019/02/17 00:08

投稿

teikoku-penguin
teikoku-penguin

スコア314

test CHANGED
@@ -58,18 +58,14 @@
58
58
 
59
59
 
60
60
 
61
- init関数をmainで呼んであげてdaoをポインタで返せばいいかと思います
61
+ 必要な時にinit関数呼んであげてdaoをポインタで返せばいいかと思います
62
-
62
+
63
- なるべく元の物に変更を加えないようにしまし
63
+ なるべく元の物に変更を加えないようにしたので正直イケてないですが恐らく動くかと
64
64
 
65
65
 
66
66
 
67
67
  ```Go
68
68
 
69
- package main
70
-
71
-
72
-
73
69
  type Room struct {
74
70
 
75
71
  ID int `json:"id"`
@@ -134,6 +130,34 @@
134
130
 
135
131
  func (room *Room) SQLRoomCreate() (err error) {
136
132
 
133
+ postgreSQL, err := init()
134
+
135
+
136
+
137
+ if err != nil {
138
+
139
+ panic(err)
140
+
141
+ }
142
+
143
+
144
+
145
+ defer postgreSQL.Close()
146
+
147
+
148
+
149
+ err = postgreSQL.Ping()
150
+
151
+
152
+
153
+ if err != nil {
154
+
155
+ panic(err)
156
+
157
+ }
158
+
159
+
160
+
137
161
  fmt.Print("\nRoomCreate is Starting!!\n\n")
138
162
 
139
163
  statement := "insert into rooms (title, content) values ($1, $2) returning id, created_at"
@@ -298,34 +322,6 @@
298
322
 
299
323
  func main() {
300
324
 
301
- postgreSQL, err := init()
302
-
303
-
304
-
305
- if err != nil {
306
-
307
- panic(err)
308
-
309
- }
310
-
311
-
312
-
313
- defer postgreSQL.Close()
314
-
315
-
316
-
317
- err = postgreSQL.Ping()
318
-
319
-
320
-
321
- if err != nil {
322
-
323
- panic(err)
324
-
325
- }
326
-
327
-
328
-
329
325
  mux := http.NewServeMux()
330
326
 
331
327
 

4

コード修正

2019/02/16 15:46

投稿

teikoku-penguin
teikoku-penguin

スコア314

test CHANGED
@@ -314,15 +314,15 @@
314
314
 
315
315
 
316
316
 
317
- err = postgreSQL.Ping()
317
+ err = postgreSQL.Ping()
318
-
319
-
320
-
318
+
319
+
320
+
321
- if err != nil {
321
+ if err != nil {
322
-
322
+
323
- panic(err)
323
+ panic(err)
324
-
324
+
325
- }
325
+ }
326
326
 
327
327
 
328
328
 

3

修正

2019/02/16 15:31

投稿

teikoku-penguin
teikoku-penguin

スコア314

test CHANGED
@@ -116,212 +116,216 @@
116
116
 
117
117
  if err != nil {
118
118
 
119
+ return nil, err
120
+
121
+ }
122
+
123
+
124
+
125
+ fmt.Print("Successfully connected!\n")
126
+
127
+
128
+
129
+ return &postgreSQL, nil
130
+
131
+ }
132
+
133
+
134
+
135
+ func (room *Room) SQLRoomCreate() (err error) {
136
+
137
+ fmt.Print("\nRoomCreate is Starting!!\n\n")
138
+
139
+ statement := "insert into rooms (title, content) values ($1, $2) returning id, created_at"
140
+
141
+
142
+
143
+ stmt, err := postgreSQL.Prepare(statement)
144
+
145
+
146
+
147
+ if err != nil {
148
+
149
+ return
150
+
151
+ }
152
+
153
+
154
+
155
+ defer stmt.Close()
156
+
157
+ err = stmt.QueryRow(room.Title, room.Content).Scan(&room.ID, &room.CreatedAt)
158
+
159
+ fmt.Print("RoomCreate is DONE")
160
+
161
+
162
+
163
+ return nil
164
+
165
+ }
166
+
167
+
168
+
169
+ func roomCreate(w http.ResponseWriter, r *http.Request) {
170
+
171
+ if r.Method != "POST" {
172
+
173
+ fmt.Print("不正なメソッドです。\n")
174
+
175
+ fmt.Printf("Method : \n%v\n", r.Method)
176
+
177
+ w.WriteHeader(http.StatusBadRequest)
178
+
179
+
180
+
181
+ return
182
+
183
+ }
184
+
185
+
186
+
187
+ if r.Header.Get("Content-Type") != "application/json" {
188
+
189
+ fmt.Print("JSONではありません。\n")
190
+
191
+ fmt.Printf("Response Header : \n%v\n", r.Header.Get("Content-Type"))
192
+
193
+ w.WriteHeader(http.StatusBadRequest)
194
+
195
+
196
+
197
+ return
198
+
199
+ }
200
+
201
+
202
+
203
+ length, err := strconv.Atoi(r.Header.Get("Content-Length"))
204
+
205
+
206
+
207
+ if err != nil {
208
+
209
+ fmt.Printf("Content-Length : \n%v\n", r.Header.Get("Content-Length"))
210
+
211
+ fmt.Print("エラーが発生しました。\n")
212
+
213
+ log.Fatal(err)
214
+
215
+ w.WriteHeader(http.StatusInternalServerError)
216
+
217
+
218
+
219
+ return
220
+
221
+ }
222
+
223
+
224
+
225
+ body := make([]byte, length)
226
+
227
+ _, err = r.Body.Read(body)
228
+
229
+
230
+
231
+ if err != nil && err != io.EOF {
232
+
233
+ fmt.Print("エラーが発生しました。\n")
234
+
235
+ log.Fatal(err)
236
+
237
+ w.WriteHeader(http.StatusInternalServerError)
238
+
239
+
240
+
241
+ return
242
+
243
+ }
244
+
245
+
246
+
247
+ var room model.Room
248
+
249
+
250
+
251
+ err = json.Unmarshal(body[:length], &room)
252
+
253
+
254
+
255
+ if err != nil {
256
+
257
+ fmt.Print("エラーが発生しました。\n")
258
+
259
+ log.Fatal(err)
260
+
261
+ w.WriteHeader(http.StatusInternalServerError)
262
+
263
+
264
+
265
+ return
266
+
267
+ }
268
+
269
+
270
+
271
+ err = room.SQLRoomCreate()
272
+
273
+
274
+
275
+ if err != nil {
276
+
277
+ fmt.Printf("*\nERROR in room.go\n*\n")
278
+
279
+ log.Fatal(err)
280
+
281
+ w.WriteHeader(http.StatusInternalServerError)
282
+
283
+
284
+
285
+ return
286
+
287
+ }
288
+
289
+
290
+
291
+ w.WriteHeader(http.StatusOK)
292
+
293
+ http.Redirect(w, r, "/room", 302)
294
+
295
+ }
296
+
297
+
298
+
299
+ func main() {
300
+
301
+ postgreSQL, err := init()
302
+
303
+
304
+
305
+ if err != nil {
306
+
119
307
  panic(err)
120
308
 
121
309
  }
122
310
 
123
-
124
-
125
- fmt.Print("Successfully connected!\n")
311
+
126
-
127
- }
312
+
128
-
129
-
130
-
131
- func (room *Room) SQLRoomCreate() (err error) {
313
+ defer postgreSQL.Close()
132
-
133
- fmt.Print("\nRoomCreate is Starting!!\n\n")
314
+
134
-
135
- statement := "insert into rooms (title, content) values ($1, $2) returning id, created_at"
315
+
136
-
137
-
138
-
316
+
139
- stmt, err := postgreSQL.Prepare(statement)
317
+ err = postgreSQL.Ping()
140
-
141
-
142
-
318
+
319
+
320
+
143
- if err != nil {
321
+ if err != nil {
144
-
145
- return
322
+
146
-
147
- }
148
-
149
-
150
-
151
- defer stmt.Close()
152
-
153
- err = stmt.QueryRow(room.Title, room.Content).Scan(&room.ID, &room.CreatedAt)
154
-
155
- fmt.Print("RoomCreate is DONE")
156
-
157
-
158
-
159
- return nil
323
+ panic(err)
160
-
161
- }
162
-
163
-
164
-
165
- func roomCreate(w http.ResponseWriter, r *http.Request) {
166
-
167
- if r.Method != "POST" {
168
-
169
- fmt.Print("不正なメソッドです。\n")
170
-
171
- fmt.Printf("Method : \n%v\n", r.Method)
172
-
173
- w.WriteHeader(http.StatusBadRequest)
174
-
175
-
176
-
177
- return
178
324
 
179
325
  }
180
326
 
181
327
 
182
328
 
183
- if r.Header.Get("Content-Type") != "application/json" {
184
-
185
- fmt.Print("JSONではありません。\n")
186
-
187
- fmt.Printf("Response Header : \n%v\n", r.Header.Get("Content-Type"))
188
-
189
- w.WriteHeader(http.StatusBadRequest)
190
-
191
-
192
-
193
- return
194
-
195
- }
196
-
197
-
198
-
199
- length, err := strconv.Atoi(r.Header.Get("Content-Length"))
200
-
201
-
202
-
203
- if err != nil {
204
-
205
- fmt.Printf("Content-Length : \n%v\n", r.Header.Get("Content-Length"))
206
-
207
- fmt.Print("エラーが発生しました。\n")
208
-
209
- log.Fatal(err)
210
-
211
- w.WriteHeader(http.StatusInternalServerError)
212
-
213
-
214
-
215
- return
216
-
217
- }
218
-
219
-
220
-
221
- body := make([]byte, length)
222
-
223
- _, err = r.Body.Read(body)
224
-
225
-
226
-
227
- if err != nil && err != io.EOF {
228
-
229
- fmt.Print("エラーが発生しました。\n")
230
-
231
- log.Fatal(err)
232
-
233
- w.WriteHeader(http.StatusInternalServerError)
234
-
235
-
236
-
237
- return
238
-
239
- }
240
-
241
-
242
-
243
- var room model.Room
244
-
245
-
246
-
247
- err = json.Unmarshal(body[:length], &room)
248
-
249
-
250
-
251
- if err != nil {
252
-
253
- fmt.Print("エラーが発生しました。\n")
254
-
255
- log.Fatal(err)
256
-
257
- w.WriteHeader(http.StatusInternalServerError)
258
-
259
-
260
-
261
- return
262
-
263
- }
264
-
265
-
266
-
267
- err = room.SQLRoomCreate()
268
-
269
-
270
-
271
- if err != nil {
272
-
273
- fmt.Printf("*\nERROR in room.go\n*\n")
274
-
275
- log.Fatal(err)
276
-
277
- w.WriteHeader(http.StatusInternalServerError)
278
-
279
-
280
-
281
- return
282
-
283
- }
284
-
285
-
286
-
287
- w.WriteHeader(http.StatusOK)
288
-
289
- http.Redirect(w, r, "/room", 302)
290
-
291
- }
292
-
293
-
294
-
295
- func main() {
296
-
297
- postgreSQL, err := init()
298
-
299
-
300
-
301
- if err != nil {
302
-
303
- panic(err)
304
-
305
- }
306
-
307
-
308
-
309
- defer postgreSQL.Close()
310
-
311
-
312
-
313
- err = postgreSQL.Ping()
314
-
315
-
316
-
317
- if err != nil {
318
-
319
- panic(err)
320
-
321
- }
322
-
323
-
324
-
325
329
  mux := http.NewServeMux()
326
330
 
327
331
 

2

追記

2019/02/16 15:29

投稿

teikoku-penguin
teikoku-penguin

スコア314

test CHANGED
@@ -51,3 +51,305 @@
51
51
  }
52
52
 
53
53
  ```
54
+
55
+
56
+
57
+ # 2/17 追記
58
+
59
+
60
+
61
+ init関数をmainで呼んであげてdaoをポインタで返せばいいかと思います
62
+
63
+ なるべく元の物に変更を加えないようにしました
64
+
65
+
66
+
67
+ ```Go
68
+
69
+ package main
70
+
71
+
72
+
73
+ type Room struct {
74
+
75
+ ID int `json:"id"`
76
+
77
+ Title string `json:"title"`
78
+
79
+ Content string `json:"content"`
80
+
81
+ CreatedAt time.Time `json:"created_at"`
82
+
83
+ Posts []Post `json:"posts"`
84
+
85
+ }
86
+
87
+
88
+
89
+ const (
90
+
91
+ host = "localhost"
92
+
93
+ port = 8080
94
+
95
+ user = "user"
96
+
97
+ password = "pw"
98
+
99
+ dbname = "database"
100
+
101
+ )
102
+
103
+
104
+
105
+ func init() (*sql.DB, error) {
106
+
107
+ psqlInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
108
+
109
+ host, port, user, password, dbname)
110
+
111
+
112
+
113
+ postgreSQL, err := sql.Open("postgres", psqlInfo)
114
+
115
+
116
+
117
+ if err != nil {
118
+
119
+ panic(err)
120
+
121
+ }
122
+
123
+
124
+
125
+ fmt.Print("Successfully connected!\n")
126
+
127
+ }
128
+
129
+
130
+
131
+ func (room *Room) SQLRoomCreate() (err error) {
132
+
133
+ fmt.Print("\nRoomCreate is Starting!!\n\n")
134
+
135
+ statement := "insert into rooms (title, content) values ($1, $2) returning id, created_at"
136
+
137
+
138
+
139
+ stmt, err := postgreSQL.Prepare(statement)
140
+
141
+
142
+
143
+ if err != nil {
144
+
145
+ return
146
+
147
+ }
148
+
149
+
150
+
151
+ defer stmt.Close()
152
+
153
+ err = stmt.QueryRow(room.Title, room.Content).Scan(&room.ID, &room.CreatedAt)
154
+
155
+ fmt.Print("RoomCreate is DONE")
156
+
157
+
158
+
159
+ return nil
160
+
161
+ }
162
+
163
+
164
+
165
+ func roomCreate(w http.ResponseWriter, r *http.Request) {
166
+
167
+ if r.Method != "POST" {
168
+
169
+ fmt.Print("不正なメソッドです。\n")
170
+
171
+ fmt.Printf("Method : \n%v\n", r.Method)
172
+
173
+ w.WriteHeader(http.StatusBadRequest)
174
+
175
+
176
+
177
+ return
178
+
179
+ }
180
+
181
+
182
+
183
+ if r.Header.Get("Content-Type") != "application/json" {
184
+
185
+ fmt.Print("JSONではありません。\n")
186
+
187
+ fmt.Printf("Response Header : \n%v\n", r.Header.Get("Content-Type"))
188
+
189
+ w.WriteHeader(http.StatusBadRequest)
190
+
191
+
192
+
193
+ return
194
+
195
+ }
196
+
197
+
198
+
199
+ length, err := strconv.Atoi(r.Header.Get("Content-Length"))
200
+
201
+
202
+
203
+ if err != nil {
204
+
205
+ fmt.Printf("Content-Length : \n%v\n", r.Header.Get("Content-Length"))
206
+
207
+ fmt.Print("エラーが発生しました。\n")
208
+
209
+ log.Fatal(err)
210
+
211
+ w.WriteHeader(http.StatusInternalServerError)
212
+
213
+
214
+
215
+ return
216
+
217
+ }
218
+
219
+
220
+
221
+ body := make([]byte, length)
222
+
223
+ _, err = r.Body.Read(body)
224
+
225
+
226
+
227
+ if err != nil && err != io.EOF {
228
+
229
+ fmt.Print("エラーが発生しました。\n")
230
+
231
+ log.Fatal(err)
232
+
233
+ w.WriteHeader(http.StatusInternalServerError)
234
+
235
+
236
+
237
+ return
238
+
239
+ }
240
+
241
+
242
+
243
+ var room model.Room
244
+
245
+
246
+
247
+ err = json.Unmarshal(body[:length], &room)
248
+
249
+
250
+
251
+ if err != nil {
252
+
253
+ fmt.Print("エラーが発生しました。\n")
254
+
255
+ log.Fatal(err)
256
+
257
+ w.WriteHeader(http.StatusInternalServerError)
258
+
259
+
260
+
261
+ return
262
+
263
+ }
264
+
265
+
266
+
267
+ err = room.SQLRoomCreate()
268
+
269
+
270
+
271
+ if err != nil {
272
+
273
+ fmt.Printf("*\nERROR in room.go\n*\n")
274
+
275
+ log.Fatal(err)
276
+
277
+ w.WriteHeader(http.StatusInternalServerError)
278
+
279
+
280
+
281
+ return
282
+
283
+ }
284
+
285
+
286
+
287
+ w.WriteHeader(http.StatusOK)
288
+
289
+ http.Redirect(w, r, "/room", 302)
290
+
291
+ }
292
+
293
+
294
+
295
+ func main() {
296
+
297
+ postgreSQL, err := init()
298
+
299
+
300
+
301
+ if err != nil {
302
+
303
+ panic(err)
304
+
305
+ }
306
+
307
+
308
+
309
+ defer postgreSQL.Close()
310
+
311
+
312
+
313
+ err = postgreSQL.Ping()
314
+
315
+
316
+
317
+ if err != nil {
318
+
319
+ panic(err)
320
+
321
+ }
322
+
323
+
324
+
325
+ mux := http.NewServeMux()
326
+
327
+
328
+
329
+ files := http.FileServer(http.Dir("assets"))
330
+
331
+ mux.Handle("/static/", http.StripPrefix("/static/", files))
332
+
333
+
334
+
335
+ mux.HandleFunc("/", homeIndex)
336
+
337
+ mux.HandleFunc("/room/new", roomCreate)
338
+
339
+
340
+
341
+ server := http.Server{
342
+
343
+ Addr: "127.0.0.1:8080",
344
+
345
+ Handler: mux,
346
+
347
+ }
348
+
349
+
350
+
351
+ log.Fatal(server.ListenAndServe())
352
+
353
+ }
354
+
355
+ ```

1

文章修正

2019/02/16 15:27

投稿

teikoku-penguin
teikoku-penguin

スコア314

test CHANGED
@@ -1,7 +1,3 @@
1
- サーバーのコードの一部なのだと思うので全部貼ってあると回答しやすいです。
2
-
3
-
4
-
5
1
  ぱっと見た感じですが提示しているコードだけ見ると func initに問題があるのではないでしょうか?
6
2
 
7
3