Mar*_*son 5 ruby-on-rails nginx redis actioncable flutter
我有一个仅包含 Rails API 的应用程序,在 nginx 中与乘客一起运行。我正在尝试使用 Action Cable 在 Flutter 中设置一个简单的聊天应用程序,但我似乎无法让它正常工作。
我可以使用以下方式进行连接:
channel = IOWebSocketChannel.connect("wss://my.domain/cable")
Run Code Online (Sandbox Code Playgroud)
发生这种情况时,请在我的 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)
Run Code Online (Sandbox Code Playgroud)
所以连接似乎已建立并成功升级
然后我发送订阅命令
channel.sink.add(json.encode({
"command": "subscribe",
"identifier": {"channel": "ConversationChannel", "conversation_id": "${conversation.id}"}
}));
Run Code Online (Sandbox Code Playgroud)
我不确定执行此命令后是否应该在日志文件中看到任何内容,但我没有。什么也没发生,并且我的 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
Run Code Online (Sandbox Code Playgroud)
但这不会出现在 Production.log 中,因此订阅命令似乎没有到达它应该去的地方。
然后,我尝试使用 dart WebSocket 使用位于此处的代码(该代码来自github 上有关连接状态的对话),看看我是否可以确定连接是否正常恢复。
当我使用我的域运行该代码时,我在 production.log 中看到相同的成功连接,但连接实际上超时了,onerror TimeoutException after 0:00:15.000000: Future not completed这似乎表明连接实际上并未成功,尽管日志文件中显示了内容。
我在这里做错了什么?
小智 0
如果我记得的话,当您尝试连接到通道时,您的标识符以及整个 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));
Run Code Online (Sandbox Code Playgroud)
Rails 在后端完成整个 JSON 解析。看看这是否对您有帮助。我之前在尝试连接 WebSockets 时遇到过类似的问题,但没有使用 ActionCable npm 库。
| 归档时间: |
|
| 查看次数: |
2081 次 |
| 最近记录: |