websocket
Electron

ElectronバックエンドとサーバとのWebSocket通信でつまずいた件

ことの発端

小規模な社内向けWebサービスで、データが変更されたことを通知するためにWebSocketを通信している。
そのWebサービスはキオスク化したPCからも見れるようになっているのだが、以前はChromeで全画面表示にしていた。
しかしユーザの認識のため認証させていたサービスなので、いちいちログイン画面を出すのはカッコ悪い。キオスクにはキオスクの口を用意し、各端末を認識できるようなしくみも作るべくElectronクライアントを作成した。

キオスク化すると長時間同じページを表示し続けることになるので、システムアップデート時などロジック含めての更新をしたい場合、View側からリロードをかけるもうまくいかない症状(タッチパネルが効かなくなるなど)が出ており、バックエンド側でWebSocket通信することに。

どうにも上手くいかない・・・
コネクション時に403エラーが出る。
Viewは相変わらず、きちんと繋がるのに。。。

この時点でお察しの方はいらっしゃると思うが、単にクロスドメイン問題に引っかかっていただけである。
認証関係なのはわかっているのに闇雲に新規実装中のnode側ばかりを疑って時間を溶かしてしまった。

node側は file://~~~ のようにローカルでうごいてて、
View側は http://~~~ でアクセスしているから上手くいっていた。

この社内サービスのサーバー側はgo+ginで書いているので、

func (p *App) websocketConnect(c *gin.Context) {
    handler := websocket.Handler(p.SocketServer.WebsocketHandler())
    handler.ServeHTTP(c.Writer, c.Request)
}

これを

func (p *App) websocketConnect(c *gin.Context) {
    s := websocket.Server{Handler: p.SocketServer.WebsocketHandler()}
    s.ServeHTTP(c.Writer, c.Request)
}

とするだけで、うまく接続できた。