【发布时间】:2016-12-10 08:42:43
【问题描述】:
我正在构建一个简单的 Slackbot 作为 Go 学习体验,但我遇到了第一个问题:我无法将消息写回连接!
这是我的主要功能:
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 和消息“意外关闭”。
我将 Gorilla 用于我的 websocket 库,我怀疑这可能是与他们的“一个读者,一个作家”限制相关的并发问题。我已经尝试了一些调整,但老实说,只是对语言/库了解不够,还没有真正深入调试这个。 :-/
我确定我在这里遗漏了一些明显的东西!管理我的 Writer 以让我的机器人回话的任何提示?谢谢!
【问题讨论】:
-
本例中没有并发访问连接。并发不是问题。如果您不确定,请使用 race detector 运行。该错误表明对等方在没有关闭握手的情况下关闭了连接。对等方是否可能不喜欢发送的消息? (我现在纠结于松弛)。
-
对 Slack 感到好奇,我查看了 API,发现它使用 JSON 来发送消息。随机猜测是 Slack 关闭了连接,因为应用程序发送了无效的 JSON(字符串
You talkin' to me?)。 -
我不知道比赛检测器 - 我会尽快检查并报告。很可能我的回复格式不正确,我没有考虑到这一点。谢谢!
-
@MellowMarmot 这只是一个格式错误的响应问题! :facepalm: 我喜欢简单的修复,但抓住它们总是很尴尬。您会放弃答案,以便我可以接受并为您提供您应得的那些甜蜜的互联网积分吗?非常感谢您的帮助!
标签: go websocket slack gorilla