WebSockets: может подключаться, но не может подписаться на канал - PullRequest
4 голосов
/ 15 марта 2019

У меня есть приложение, предназначенное только для rails API, в nginx с пассажиром.Я пытаюсь использовать Action Cable для настройки простого приложения чата во Flutter, но не могу заставить его работать правильно.

Я могу подключиться, используя следующее:

 channel = IOWebSocketChannel.connect("wss://my.domain/cable")

и посмотрите следующее в моем файле production.log, когда это произойдет:

Started GET "/cable" for [redacted] at 2019-03-14 19:44:09 +0000
Started GET "/cable" [WebSocket] for [redacted] at 2019-03-14 19:44:09 +0000
Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: upgrade, HTTP_UPGRADE: websocket)
Doorkeeper::AccessToken Load (0.3ms)  SELECT  `oauth_access_tokens`.* FROM `oauth_access_tokens` WHERE `oauth_access_tokens`.`token` = '[redacted]' LIMIT 1
User Load (0.2ms)  SELECT  `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
Registered connection (Z2lkOi8vYWdlbnQyNHg3L1VzZXIvMg)

Итак, соединение установлено и успешно обновлено

Затем я отправляю команду подписки

channel.sink.add(json.encode({
  "command": "subscribe",
  "identifier": {"channel": "ConversationChannel", "conversation_id": "${conversation.id}"}
}));

Я не уверен, должен ли я что-либо видеть в файлах журнала после выполнения этой команды, но я не вижу.Ничего не происходит, и в моем файле production.log или в журнале ошибок nginx нет никаких указаний на какие-либо ошибки.Я настроил некоторые записи в методе подписки ConversationChannel, чтобы он, по крайней мере, выводил что-то в рабочий журнал при его вызове, чтобы я мог проверить, если он хотя бы вызывает команду подписки

class ConversationChannel < ApplicationCable::Channel
    def subscribed
      Rails.logger.info "test conversation subscribe"
      reject && return unless current_user
      stream_from "conversation_#{params[:conversation_id]}_channel"
    end

    ...

end

но это не отображается в production.log, поэтому может показаться, что команда подписки не достигает того места, куда она должна идти.

Затем я попытался использовать dart WebSocket, используя код, расположенный здесь , который пришел из разговора на github относительно состояний соединения , чтобы посмотреть, смогу ли я определить, нормально ли восстанавливается соединение.

Когда я запускаю этот код со своим доменом, я вижутакое же успешное соединение в файле production.log, но на самом деле соединение истекло с onerror TimeoutException after 0:00:15.000000: Future not completed, что, похоже, указывает на то, что на самом деле не , в конце концов, установилось успешно, несмотря на то, что указано в файле журнала.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 21 марта 2019

Если я помню, когда вы пытаетесь подключиться к каналу, ваш идентификатор должен быть в формате JSON, а также весь ваш объект JSON. Взгляните на эту ссылку:

https://thoughtbot.com/blog/talking-to-actioncable-without-rails

В частности:

const msg = {
  command: 'subscribe',
  identifier: JSON.stringify({
    channel: 'SomeChannel',
  }),
};
socket.send(JSON.stringify(msg));

Rails выполняет весь JSON-анализ в серверной части. Посмотрите, поможет ли это вам. У меня были подобные проблемы раньше, когда я пытался подключить WebSockets без использования их библиотеки ActionCable npm.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...