2016-12-09 11 views
0

Я строю простой Slackbot как опыт обучения с Go, и я ударил свою первую загвоздку: я не могу написать сообщение обратно в соединение!Ошибка веб-рассылки на 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 & сообщение «неожиданное закрытие».

Я использую Gorilla для своей библиотеки websocket, и я подозреваю, что это проблема параллелизма, связанная с лимитом «один читатель, один автор». Я пробовал несколько хитростей, но, честно говоря, просто не знаю достаточно о том, что ягня/библиотека еще не погрузилась глубоко в отладку. : -/

Уверен, что мне не хватает чего-то очевидного здесь! Какие-нибудь советы для управления моим писателем, чтобы мой бот говорил? Благодаря!

+1

В этом примере нет параллельного доступа к соединению. Параллелизм не является проблемой. Запустите с помощью [расы детектор] (https://golang.org/doc/articles/race_detector.html), если вы не уверены. Ошибка указывает на то, что сверстник закрыл соединение без закрытого рукопожатия. Возможно ли, что пэру не понравилось отправленное сообщение? (Теперь я успокаиваюсь). –

+1

Будучи любопытным в Slack, я искал API и вижу, что он использует JSON для сообщений. Случайная догадка заключается в том, что Slack закрыл соединение, потому что приложение отправило недопустимый JSON (строка 'You talkin 'для меня?'). –

+0

Я не знал о детекторе гонки - я скоро проверю это и отчитаю. Очень возможно, что мой ответ искажен, я не считал это. Спасибо! – Alex

ответ

1

Сообщение, отправленное на сервер, не является JSON, как ожидалось сервером. Сервер закрыл соединение без рукопожатия.