私は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 /ライブラリについてはまだ分かりません。 :/
私は確かにここに何かが欠けていると思います!私のライターを管理してボットの話を取り戻すためのヒント?ありがとう!
この例では、接続への同時アクセスはありません。並行性は問題ではありません。あなたが不明な場合は[競合検出器](https://golang.org/doc/articles/race_detector.html)で実行してください。このエラーは、ピアがクローズハンドシェイクなしで接続を閉じたことを示します。ピアは、送信されたメッセージが気に入らない可能性がありますか? (私は今、たるみについては知らない)。 –
Slackについて興味があるので、私はAPIを調べ、メッセージにJSONを使用していることを確認します。ランダムな推測では、アプリケーションが無効なJSON(文字列 'You talkin 'to me?)を送信したため、Slackが接続を閉じたということです。 –
私はレースディテクタについては知らなかった - 私はすぐにそれをチェックし、報告する。非常に私の応答が不正である可能性がある、私はそれを考慮しなかった。ありがとう! – Alex