質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

Q&A

0回答

1564閲覧

go buildして作成されたexeで発生するエラー

Gunjirk

総合スコア23

Go

Go(golang)は、Googleで開発されたオープンソースのプログラミング言語です。

0グッド

0クリップ

投稿2022/03/12 05:38

編集2022/04/07 03:42

以下のserver.goをgo buildして作成されたserver.exeを実行すると、画面は表示されるのですが、
ログイン処理を行うと、エラーが発生します。
昨年5月頃にビルドしたexeはエラーが発生することなく動いていたのですが、
現在同じソースでビルドするとエラーが発生してしまうので、何か変わったことがあるのかと思います。

GO

1package main 2 3import ( 4 "database/sql" 5 "fmt" 6 "io" 7 "net/http" 8 "os" 9 10 controller "./controllers/controller" 11 12 _ "github.com/go-sql-driver/mysql" 13 "github.com/joho/godotenv" 14 "github.com/kardianos/service" 15 rotatelogs "github.com/lestrrat-go/file-rotatelogs" 16 "github.com/spiegel-im-spiegel/logf" 17) 18 19type program struct{} 20 21func (p *program) Start(s service.Service) error { 22 // Start should not block. Do the actual work async. 23 go p.run() 24 return nil 25} 26func (p *program) run() { 27 28 // ************************************** 29 // ログファイル作成 30 // ************************************** 31 32 logf.SetMinLevel(logf.DEBUG) 33 // rl, err := rotatelogs.New("C:/Users/navita-remo/go/kokyaku/log/kokyaku.%Y%m%d.log") 34 rl, err := rotatelogs.New("C:/work/顧客台帳システム/kokyaku/log/kokyaku.%Y%m%d.log") 35 if err != nil { 36 logf.Error(err) 37 } 38 ws := io.MultiWriter( 39 rl, 40 os.Stdout, 41 ) 42 logf.SetOutput(ws) 43 44 logger := logf.New( 45 logf.WithFlags(logf.LstdFlags|logf.Lshortfile), 46 // logf.WithPrefix("[Sample] "), 47 logf.WithWriter(rl), 48 logf.WithMinLevel(logf.INFO), 49 ) 50 51 logger.Print("サービスが開始されました") 52 53 // ************************************** 54 // JSONリクエスト処理 55 // ************************************** 56 57 http.HandleFunc("/json", dumpJSONRequestHandlerFunc) 58 // http.ListenAndServe(":8080", nil) 59 http.ListenAndServe(":8083", nil) //修正後テスト用 60} 61 62func (p *program) Stop(s service.Service) error { 63 64 // ************************************** 65 // ログファイル作成 66 // ************************************** 67 68 logf.SetMinLevel(logf.DEBUG) 69 // rl, err := rotatelogs.New("C:/Users/navita-remo/go/kokyaku/log/kokyaku.%Y%m%d.log") 70 rl, err := rotatelogs.New("C:/work/顧客台帳システム/kokyaku/log/kokyaku.%Y%m%d.log") 71 if err != nil { 72 logf.Error(err) 73 } 74 ws := io.MultiWriter( 75 rl, 76 os.Stdout, 77 ) 78 logf.SetOutput(ws) 79 80 logger := logf.New( 81 logf.WithFlags(logf.LstdFlags|logf.Lshortfile), 82 // logf.WithPrefix("[Sample] "), 83 logf.WithWriter(rl), 84 logf.WithMinLevel(logf.INFO), 85 ) 86 87 // Stop should not block. Return with a few seconds. 88 logger.Print("サービスが停止されました") 89 return nil 90} 91 92func main() { 93 94 // ************************************** 95 // ログファイル作成 96 // ************************************** 97 98 logf.SetMinLevel(logf.DEBUG) 99 // rl, err := rotatelogs.New("C:/Users/navita-remo/go/kokyaku/log/kokyaku.%Y%m%d.log") 100 rl, err := rotatelogs.New("C:/work/顧客台帳システム/kokyaku/log/kokyaku.%Y%m%d.log") 101 if err != nil { 102 logf.Error(err) 103 } 104 ws := io.MultiWriter( 105 rl, 106 os.Stdout, 107 ) 108 logf.SetOutput(ws) 109 110 logger := logf.New( 111 logf.WithFlags(logf.LstdFlags|logf.Lshortfile), 112 // logf.WithPrefix("[Sample] "), 113 logf.WithWriter(rl), 114 logf.WithMinLevel(logf.INFO), 115 ) 116 117 svcConfig := &service.Config{ 118 Name: "KokyakuService", 119 DisplayName: "Kokyaku Service", 120 Description: "This is the Kokyaku Daicho service.", 121 } 122 123 prg := &program{} 124 s, err := service.New(prg, svcConfig) 125 if err != nil { 126 logger.Error(err) 127 } 128 if err != nil { 129 logger.Error(err) 130 } 131 err = s.Run() 132 if err != nil { 133 logger.Error(err) 134 } 135} 136 137func dumpJSONRequestHandlerFunc(w http.ResponseWriter, req *http.Request) { 138 139 // ************************************** 140 // ログファイル作成 141 // ************************************** 142 143 logf.SetMinLevel(logf.DEBUG) 144 // rl, err := rotatelogs.New("C:/Users/navita-remo/go/kokyaku/log/kokyaku.%Y%m%d.log") 145 rl, err := rotatelogs.New("C:/work/顧客台帳システム/kokyaku/log/kokyaku.%Y%m%d.log") 146 if err != nil { 147 logf.Error(err) 148 } 149 ws := io.MultiWriter( 150 rl, 151 os.Stdout, 152 ) 153 logf.SetOutput(ws) 154 155 logger := logf.New( 156 logf.WithFlags(logf.LstdFlags|logf.Lshortfile), 157 // logf.WithPrefix("[Sample] "), 158 logf.WithWriter(rl), 159 logf.WithMinLevel(logf.INFO), 160 ) 161 162 // envファイル呼び出し 163 // err = godotenv.Load("C:/Users/h_gun/go/kokyaku_ver2/kokyaku.env") 164 // err = godotenv.Load("C:/work/顧客台帳システム/kokyaku/kokyaku.env") 165 err = godotenv.Load("C:/work/顧客台帳システム/test/kokyaku_ver2/kokyaku.env") 166 if err != nil { 167 logger.Error(err) 168 } 169 170 // ************************************** 171 // HTTP通信処理 172 // ************************************** 173 174 w.Header().Set("Access-Control-Allow-Origin", "*") 175 w.Header().Set("Access-Control-Allow-Headers", "Content-Type") 176 177 // リクエスト検証 178 if req.Method != "POST" { 179 w.WriteHeader(http.StatusBadRequest) 180 return 181 } 182 183 CONTENTTYPE := os.Getenv("CONTENTTYPE") 184 // fmt.Println(CONTENTTYPE) 185 // fmt.Println(req.Header.Get("Content-Type")) 186 if req.Header.Get("Content-Type") != CONTENTTYPE { 187 188 w.WriteHeader(http.StatusBadRequest) 189 return 190 } 191 if err := req.ParseForm(); err != nil { 192 logger.Error(err) 193 } 194 195 cmd := req.PostFormValue("cmd") 196 data := req.PostFormValue("data") 197 fmt.Println(data) 198 199 w.WriteHeader(http.StatusOK) 200 201 // ************************************** 202 // DB接続 203 // ************************************** 204 205 DBMS := "mysql" 206 USER := os.Getenv("DBUSER") 207 PASS := os.Getenv("PASSWORD") 208 DBNAME := os.Getenv("DBNAME") + "?parseTime=true&loc=Asia%2FTokyo" 209 PROTOCOL := os.Getenv("PROTOCOL") 210 211 db, err := sql.Open(DBMS, USER+":"+PASS+"@"+PROTOCOL+"/"+DBNAME) 212 213 if err != nil { 214 logger.Error(err) 215 } 216 defer db.Close() 217 218 // ************************************** 219 // API別DB処理 220 // ************************************** 221 222 switch cmd { 223 224 // 1.ログインAPI 225 case "loginAPI": 226 controller.Login(cmd, data, w, db) 227 228 // 2.キーワード検索API 229 case "searchKeywordAPI": 230 controller.SeachKeywords(cmd, data, w, db) 231 232 // 3.結果詳細API 233 case "resultDetailAPI": 234 controller.ResultDetail(cmd, data, w, db) 235 236 // 4.契約明細API 237 case "keiyakuMeisaiAPI": 238 controller.KeiyakuMeisai(cmd, data, w, db) 239 240 // 5.契約履歴API 241 case "keiyakuHistoryAPI": 242 controller.KeiyakuHistory(cmd, data, w, db) 243 } 244} 245

GO

1package controller 2 3import ( 4 "database/sql" 5 "encoding/json" 6 "io" 7 "net/http" 8 "os" 9 10 entity "../../models/entity" 11 responsejson "../responsejson" 12 13 rotatelogs "github.com/lestrrat-go/file-rotatelogs" 14 "github.com/spiegel-im-spiegel/logf" 15) 16 17func Login(cmd string, data string, w http.ResponseWriter, db *sql.DB) { 18 19 // ************************************** 20 // ログファイル作成 21 // ************************************** 22 23 logf.SetMinLevel(logf.DEBUG) 24 // rl, err := rotatelogs.New("C:/Users/navita-remo/go/kokyaku/log/kokyaku.%Y%m%d.log") 25 rl, err := rotatelogs.New("C:/work/顧客台帳システム/kokyaku/log/kokyaku.%Y%m%d.log") 26 if err != nil { 27 logf.Error(err) 28 } 29 ws := io.MultiWriter( 30 rl, 31 os.Stdout, 32 ) 33 logf.SetOutput(ws) 34 35 logger := logf.New( 36 logf.WithFlags(logf.LstdFlags|logf.Lshortfile), 37 logf.WithWriter(rl), 38 logf.WithMinLevel(logf.INFO), 39 ) 40 41 // login API 42 li := entity.Login{} 43 err = json.Unmarshal([]byte(data), &li) 44 if err != nil { 45 logger.Errorf("%s,(ID:%s)\n", err, li.UserID) 46 } 47 48 res := new(entity.LoginResponse) 49 res.Cmd = cmd 50 res.Ret = "0" 51 res.UserID = li.UserID 52 53 LoginColumn := ` 54 DM_USER.USER_NAME_KNJ, 55 DM_KYOTEN.KYOTEN_NAME_KNJ, 56 DM_USER.PASSWORD_ENABLE_KIGEN_DATE 57 ` 58 join := ` 59 inner join DM_KYOTEN on DM_USER.KYOTEN_CD = DM_KYOTEN.KYOTEN_CD 60 ` 61 var PasswordEnableKigenDate string 62 63 // 1レコードをSELECT 64 err = db.QueryRow("SELECT "+LoginColumn+" FROM DM_USER "+join+" WHERE DM_USER.USER_ID = \""+li.UserID+"\" AND DM_USER.PASSWORD = \""+li.Password+"\"").Scan( 65 &res.Username, 66 &res.Kyotenname, 67 &PasswordEnableKigenDate, 68 ) 69 if err != nil { 70 logger.Errorf("%s,(ID:%s)\n", err, li.UserID) 71 res.Ret = "1" 72 } else { 73 logger.Print("ログインしました(ID:" + li.UserID + ")") 74 } 75 76 // JSON変換してクライアントに送る 77 resJSON, _ := json.Marshal(res) 78 responsejson.ResponseJSON(resJSON, w) 79} 80 81func logger() { 82 83} 84

エラー

2022/03/11 13:05:36 http: panic serving [::1]:55814: runtime error: invalid memory address or nil pointer dereference
goroutine 19 [running]:
net/http.(*conn).serve.func1()
C:/Program Files/Go/src/net/http/server.go:1802 +0xb9
panic({0x104a300, 0x12c60d0})
C:/Program Files/Go/src/runtime/panic.go:1047 +0x266
database/sql.(*DB).Close(0x0)
C:/Program Files/Go/src/database/sql/sql.go:884 +0x38
panic({0x104a300, 0x12c60d0})
C:/Program Files/Go/src/runtime/panic.go:1038 +0x215
database/sql.(*DB).conn(0x0, {0x1102ff0, 0xc00000a050}, 0x1)
C:/Program Files/Go/src/database/sql/sql.go:1260 +0x53
database/sql.(*DB).query(0xc000051568, {0x1102ff0, 0xc00000a050}, {0xc0001a4360, 0x10d}, {0x0, 0x0, 0x0}, 0xd)
C:/Program Files/Go/src/database/sql/sql.go:1695 +0x5d
database/sql.(*DB).QueryContext(0x2682d7c0a28, {0x1102ff0, 0xc00000a050}, {0xc0001a4360, 0x10d}, {0x0, 0x0, 0x0})
C:/Program Files/Go/src/database/sql/sql.go:1674 +0xdf
database/sql.(*DB).QueryRowContext(...)
C:/Program Files/Go/src/database/sql/sql.go:1778
database/sql.(*DB).QueryRow(0xc00018b000, {0xc0001a4360, 0x9}, {0x0, 0xc00019a780, 0x22})
C:/Program Files/Go/src/database/sql/sql.go:1792 +0x4a
/C/Users/h_gun/go/kokyaku_ver3/controllers/controller.Login({0xc00018e284, 0x8}, {0xc00018ad40, 0x3a}, {0x1101d98, 0xc0001ac0e0}, 0x8)
C:/Users/h_gun/go/kokyaku_ver3/controllers/controller/login.go:64 +0x4b8
main.dumpJSONRequestHandlerFunc({0x1101d98, 0xc0001ac0e0}, 0xc0001de100)
C:/Users/h_gun/go/kokyaku_ver3/server.go:226 +0x845
net/http.HandlerFunc.ServeHTTP(0x30000, {0x1101d98, 0xc0001ac0e0}, 0xc0001ac0e0)
C:/Program Files/Go/src/net/http/server.go:2047 +0x2f
net/http.(*ServeMux).ServeHTTP(0x0, {0x1101d98, 0xc0001ac0e0}, 0xc0001de100)
C:/Program Files/Go/src/net/http/server.go:2425 +0x149
net/http.serverHandler.ServeHTTP({0x11011a8}, {0x1101d98, 0xc0001ac0e0}, 0xc0001de100)
C:/Program Files/Go/src/net/http/server.go:2879 +0x43b
net/http.(*conn).serve(0xc0001ba0a0, {0x1103060, 0xc00019a1b0})
C:/Program Files/Go/src/net/http/server.go:1930 +0xb08
created by net/http.(*Server).Serve
C:/Program Files/Go/src/net/http/server.go:3034 +0x4e8

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hoshi-takanori

2022/03/13 04:46

controller.Login の中の SQL の処理に問題がありそうですね…。
Gunjirk

2022/04/07 03:42

ご確認ありがとうございます。 また、気づくのが遅れてしまい、申し訳ございません。 SQLの処理に問題がありそうだとご指摘いただいたcontroller.loginのソースコードを追記いたしましたので、ご確認宜しくお願い致します。正常に動いていた時から修正はしておりません。
hoshi-takanori

2022/04/07 15:48 編集

db.QueryRow の中で nil アクセスしてるっぽいので、たぶん db が nil つまり DB 接続に失敗してるのでは。 (sql.Open の結果がエラーの場合、logger.Error した後、そのまま実行継続してるので…。) また、db.QueryRow に関しては他にも問題があります。 ・SQL の文字列は " ではなく ' で囲みます。 ・入力値を文字列結合するのは SQL インジェクションの脆弱性があります。 ・パスワードを DB に平文保存するのはやめましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問