質問編集履歴

2

コードの追記。

2019/02/15 23:35

投稿

uk_63
uk_63

スコア29

test CHANGED
File without changes
test CHANGED
@@ -282,6 +282,312 @@
282
282
 
283
283
 
284
284
 
285
+ # コード(回答を受けて編集ました)
286
+
287
+
288
+
289
+ 指摘を受けた部分を試してみましたが、同じくエラーが出ています。
290
+
291
+
292
+
293
+ ```
294
+
295
+ http: panic serving 127.0.0.1:59381: runtime error: invalid memory address or nil pointer dereference
296
+
297
+ ```
298
+
299
+
300
+
301
+ ログを見たところ、`SQLRoomCreate`という関数のところでエラーがでていると思われます。誤っている箇所がないか確認していただきたいです。よろしくおねがいします!
302
+
303
+
304
+
305
+ ```go
306
+
307
+ // package, import 部分は省略しています。
308
+
309
+
310
+
311
+
312
+
313
+ // Room ・誰でも投稿できる ・has_many Post
314
+
315
+ type Room struct {
316
+
317
+ ID int `json:"id"`
318
+
319
+ Title string `json:"title"`
320
+
321
+ Content string `json:"content"`
322
+
323
+ CreatedAt time.Time `json:"created_at"`
324
+
325
+ Posts []Post `json:"posts"`
326
+
327
+ }
328
+
329
+
330
+
331
+ var postgreSQL *sql.DB
332
+
333
+ // ここでDBへの接続情報入力
334
+
335
+ const (
336
+
337
+ host = "localhost"
338
+
339
+ port = 8080
340
+
341
+ user = "user"
342
+
343
+ password = "pw"
344
+
345
+ dbname = "database"
346
+
347
+ )
348
+
349
+
350
+
351
+ func init() {
352
+
353
+ // 変数に入れました。
354
+
355
+ psqlInfo := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=disable",
356
+
357
+ host, port, user, password, dbname)
358
+
359
+ // それを代入しました。
360
+
361
+ postgreSQL, err := sql.Open("postgres", psqlInfo)
362
+
363
+ // init 内では使っていなためにエラーが出る。それの回避でアンダースコア。
364
+
365
+ var _ = postgreSQL
366
+
367
+ if err != nil {
368
+
369
+ panic(err)
370
+
371
+ }
372
+
373
+
374
+
375
+ // ColseしているためにDBに接続していないと予想。
376
+
377
+
378
+
379
+ // defer postgreSQL.Close()
380
+
381
+
382
+
383
+ // err = postgreSQL.Ping()
384
+
385
+ // if err != nil {
386
+
387
+ // panic(err)
388
+
389
+ // }
390
+
391
+
392
+
393
+ fmt.Print("Successfully connected!\n")
394
+
395
+ }
396
+
397
+
398
+
399
+
400
+
401
+ // SQLRoomCreate [ Create a new room ]
402
+
403
+ func (room *Room) SQLRoomCreate() (err error) {
404
+
405
+ fmt.Print("\nRoomCreate is Starting!!\n\n")
406
+
407
+ statement := "insert into rooms (title, content) values ($1, $2) returning id, created_at"
408
+
409
+
410
+
411
+ ///////////////////////////
412
+
413
+ // ここでエラーが発生している!!??
414
+
415
+ //////////////////////////
416
+
417
+
418
+
419
+ stmt, err := postgreSQL.Prepare(statement)
420
+
421
+ if err != nil {
422
+
423
+ return
424
+
425
+ }
426
+
427
+ defer stmt.Close()
428
+
429
+ err = stmt.QueryRow(room.Title, room.Content).Scan(&room.ID, &room.CreatedAt)
430
+
431
+ fmt.Print("RoomCreate is DONE")
432
+
433
+ return
434
+
435
+ }
436
+
437
+
438
+
439
+ func roomCreate(w http.ResponseWriter, r *http.Request) {
440
+
441
+ if r.Method != "POST" {
442
+
443
+ fmt.Print("不正なメソッドです。\n")
444
+
445
+ fmt.Printf("Method : \n%v\n", r.Method)
446
+
447
+ w.WriteHeader(http.StatusBadRequest)
448
+
449
+ return
450
+
451
+ }
452
+
453
+
454
+
455
+ if r.Header.Get("Content-Type") != "application/json" {
456
+
457
+ fmt.Print("JSONではありません。\n")
458
+
459
+ fmt.Printf("Response Header : \n%v\n", r.Header.Get("Content-Type"))
460
+
461
+ w.WriteHeader(http.StatusBadRequest)
462
+
463
+ return
464
+
465
+ }
466
+
467
+
468
+
469
+ //To allocate slice for request body
470
+
471
+ length, err := strconv.Atoi(r.Header.Get("Content-Length"))
472
+
473
+ if err != nil {
474
+
475
+ fmt.Printf("Content-Length : \n%v\n", r.Header.Get("Content-Length"))
476
+
477
+ fmt.Print("エラーが発生しました。\n")
478
+
479
+ log.Fatal(err)
480
+
481
+ w.WriteHeader(http.StatusInternalServerError)
482
+
483
+ return
484
+
485
+ }
486
+
487
+
488
+
489
+ // Read メソッドが []byte を読み込むことになっている
490
+
491
+ body := make([]byte, length)
492
+
493
+ _, err = r.Body.Read(body)
494
+
495
+ if err != nil && err != io.EOF {
496
+
497
+ fmt.Print("エラーが発生しました。\n")
498
+
499
+ log.Fatal(err)
500
+
501
+ w.WriteHeader(http.StatusInternalServerError)
502
+
503
+ return
504
+
505
+ }
506
+
507
+
508
+
509
+ // 受け取ったJSONを解析して構造体 Room にマッピング
510
+
511
+ // []byteをlength 分だけパースする
512
+
513
+ var room model.Room
514
+
515
+ err = json.Unmarshal(body[:length], &room)
516
+
517
+ if err != nil {
518
+
519
+ fmt.Print("エラーが発生しました。\n")
520
+
521
+ log.Fatal(err)
522
+
523
+ w.WriteHeader(http.StatusInternalServerError)
524
+
525
+ return
526
+
527
+ }
528
+
529
+
530
+
531
+ err = room.SQLRoomCreate()
532
+
533
+ if err != nil {
534
+
535
+ fmt.Printf("*\nERROR in room.go\n*\n")
536
+
537
+ log.Fatal(err)
538
+
539
+ w.WriteHeader(http.StatusInternalServerError)
540
+
541
+ return
542
+
543
+ }
544
+
545
+ w.WriteHeader(http.StatusOK)
546
+
547
+ http.Redirect(w, r, "/room", 302)
548
+
549
+ }
550
+
551
+
552
+
553
+ func main() {
554
+
555
+ mux := http.NewServeMux()
556
+
557
+
558
+
559
+ files := http.FileServer(http.Dir("assets"))
560
+
561
+ mux.Handle("/static/", http.StripPrefix("/static/", files))
562
+
563
+
564
+
565
+ mux.HandleFunc("/", homeIndex)
566
+
567
+ mux.HandleFunc("/room/new", roomCreate)
568
+
569
+
570
+
571
+ server := http.Server{
572
+
573
+ Addr: "127.0.0.1:8080",
574
+
575
+ Handler: mux,
576
+
577
+ }
578
+
579
+ log.Fatal(server.ListenAndServe())
580
+
581
+ }
582
+
583
+
584
+
585
+ ```
586
+
587
+
588
+
589
+
590
+
285
591
  # 質問
286
592
 
287
593
 

1

誤字

2019/02/15 23:35

投稿

uk_63
uk_63

スコア29

test CHANGED
File without changes
test CHANGED
@@ -72,10 +72,6 @@
72
72
 
73
73
  postgreSQL, err := sql.Open("postgres", "user=user dbname=db password=pw sslmode=disable")
74
74
 
75
- // init 内では使っていなためにエラーが出る。それの回避でアンダースコア。
76
-
77
- var _ = postgreSQL
78
-
79
75
  if err != nil {
80
76
 
81
77
  panic(err)