2016-12-09 10 views
0

私はGoとの学習経験としてシンプルなSlackbotを構築しています。私は最初の問題にぶつかりました。接続にメッセージを書き込めません!ここでWebSocketがWriteMessageに失敗しました

は私のメインのFUNCです:

func main() { 
    conn, botId, err := slackInit(os.Getenv("SLACKBOT_TOKEN")) 
    if err != nil { return } 

    defer conn.Close() 
    for { 
    _, event, err := conn.ReadMessage() 
    if err != nil { 
     fmt.Println("Error processing message:", err) 
     return 
    } 

    fmt.Println(string(event)) 

    message, err := slackGetMessage(event) 
    if strings.Contains(message, botId) { 
     fmt.Println("Bot was mentioned!") 
     resp := []byte("You talkin' to me?") 
     err = conn.WriteMessage(1, resp) 
     if err != nil { 
     fmt.Println("Error writing message:", string(resp)) 
     return 
     } 
    } 
    } 
} 

これは、リッスンしていない問題でイベントをレポートしますが、できるだけ早くconn.WriteMessageメソッドが呼び出されると失敗します。私はwebsocketからコード1006 &の「致命的なエラー」メッセージを表示します。

私はwebsocketライブラリにGorillaを使用していますが、これは "1人の読者、1人の作家"の制限に関連する並行性の問題かもしれません。私はいくつか微調整を試みましたが、正直なところ、このデバッグについて深く深く掘り下げるために、languge /ライブラリについてはまだ分かりません。 :/

私は確かにここに何かが欠けていると思います!私のライターを管理してボットの話を取り戻すためのヒント?ありがとう!

+1

この例では、接続への同時アクセスはありません。並行性は問題ではありません。あなたが不明な場合は[競合検出器](https://golang.org/doc/articles/race_detector.html)で実行してください。このエラーは、ピアがクローズハンドシェイクなしで接続を閉じたことを示します。ピアは、送信されたメッセージが気に入らない可能性がありますか? (私は今、たるみについては知らない)。 –

+1

Slackについて興味があるので、私はAPIを調べ、メッセージにJSONを使用していることを確認します。ランダムな推測では、アプリケーションが無効なJSON(文字列 'You talkin 'to me?)を送信したため、Slackが接続を閉じたということです。 –

+0

私はレースディテクタについては知らなかった - 私はすぐにそれをチェックし、報告する。非常に私の応答が不正である可能性がある、私はそれを考慮しなかった。ありがとう! – Alex

答えて

1

サーバーに送信されるメッセージは、サーバーによって期待されるJSONではありません。サーバーはハンドシェイクなしで接続を閉じました。

関連する問題