编程语言
首页 > 编程语言> > ruby-on-rails – WebSockets:可以连接但无法订阅频道

ruby-on-rails – WebSockets:可以连接但无法订阅频道

作者:互联网

我有一个在nginx中与乘客一起运行的rails API专用应用程序.我正在尝试使用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的subscribe方法中设置了一些日志记录,所以它在调用时至少会输出一些东西给生产日志,所以我可以测试它是否至少调用了subscribe命令

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使用位于here的代码here来查看我是否可以确定连接是否正常.

当我使用我的域运行该代码时,我在production.log中看到了相同的成功连接,但是在0:00:15.000000之后,连接实际上超时了onerror TimeoutException:未来未完成,这似乎表明连接实际上没有毕竟,尽管它在日志文件中说的是什么.

我在这做错了什么?

解决方法:

如果我记得,当您尝试连接到某个频道时,您的标识符必须是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库时,我遇到过类似的问题.

标签:nginx,ruby-on-rails,redis,flutter,actioncable
来源: https://codeday.me/bug/20190710/1424237.html