【问题标题】:How to detect if ActionCable subscription request failed如何检测 ActionCable 订阅请求是否失败
【发布时间】:2018-07-06 21:45:45
【问题描述】:

我最近部署了一个 Rails 应用程序,并从一些用户那里得知该应用程序无法在他们的工作环境中运行。很明显,Websockets 被他们阻止了。

我已经浏览了有关此问题的 Rails 文档,但找不到任何有关如何检测是否发生这种情况的信息。我最好的猜测是为 ActionCable 广播发送一个 AJAX 请求,当在某个超时后没有收到该广播时,得出结论 Websockets 必须被阻止。

这里是否有任何简单的答案(可能已经是 Rails API 的一部分)来确定 Websocket 连接性?

【问题讨论】:

  • 你需要阅读你的服务器日志..它将包括那些信息
  • 我认为这不会有帮助。我正在从客户端查看这一点 - 客户端可以使用哪些信息来确定他们从 App.cable.subscriptions.create 发出的请求是否表明失败?我看到的所有返回是:connected: -> ,disconnected: -> 和 received: (data) -> 但我不知道如何判断请求是否失败。

标签: ruby-on-rails actioncable


【解决方案1】:

您可以使用rejected 处理程序。当订阅被服务器拒绝时,这应该会触发。

以下咖啡脚本示例来自official rails docs

App.cable.subscriptions.create "AppearanceChannel",
  # Called when the subscription is ready for use on the server.
  connected: ->
    // Do something

  # Called when the subscription is rejected by the server.
  rejected: ->
    // Do something

【讨论】:

  • 我已经看到了,但没有能力对其进行测试 - 这对我来说听起来像是一个特定的拒绝,我想知道防火墙的情况。这也会引发防火墙问题吗?我在官方文档中找不到有关触发该调用的信息。
【解决方案2】:

每当动作电缆连接失败时,它都会写入浏览器控制台failed: WebSocket is closed before the connection is established

您可以利用它来了解是否存在连接错误:

def action_cable_connection_errored?
  page.driver.browser.manage.logs.get(:browser)
        .map(&:message)
        .join
        .match('failed: WebSocket is closed before the connection is established')
end

【讨论】:

    【解决方案3】:

    我有一个不太好的解决方法,但比我见过的任何其他方法都好。 Rails 不提供接口,但您可以使用原生 WebSocket 并处理错误。

    consumer.subscriptions.create("ChatChannel", { ... });
    
    consumer.connection.webSocket.onerror = function () {
      console.log('Websocket connection error!');
      // Error handling goes here. Fallback to polling, perhaps.
    };
    

    ActionCable 将继续尝试重新连接,这只会抓住第一次失败,但这足以涵盖许多情况。

    【讨论】:

      猜你喜欢
      • 2019-05-15
      • 1970-01-01
      • 2016-08-07
      • 2023-03-28
      • 1970-01-01
      • 2013-03-15
      • 1970-01-01
      • 2016-12-16
      • 2013-08-26
      相关资源
      最近更新 更多