【问题标题】:Firebase - Is there a flag to force long polling when websockets are blocked by corporate proxy/firewall?Firebase - 当 websocket 被公司代理/防火墙阻止时,是否有强制长轮询的标志?
【发布时间】:2013-12-27 17:57:13
【问题描述】:

我正在开发一个简单的公司 AngularJS 应用程序,并计划使用 Firebase 作为后端。

我必须支持的浏览器是 IE8 和 Chrome(最新)。

我已经设法在前端修复了所有与 IE 相关的怪癖,并且可以成功地从我的 Firebase 中检索数据。由于 IE8 不支持 WebSockets,我认为它使用的是长轮询。 (这在性能方面很好,应用程序非常简单,只需拉取/更新两到三条数据)。

自相矛盾的是,我在 Chrome 中反复看到以下错误,并且无法连接到 Firebase。我假设这是由于公司网络的防火墙/代理造成的。

WebSocket connection to 'wss://xxx.firebaseio.com/.es?v=5' failed: WebSocket is closed before the connection is established.

我无法控制防火墙/代理,所以我的问题是我是否可以强制 Chrome 也使用长轮询,在创建 Firebase 引用时使用某种配置标志?

我混合使用 Angularfire 和直接 Firebase。该应用程序在 IE 中完美运行,因此我的代码似乎没有任何问题。 (简单的测试脚本也会遇到同样的问题)

更新:该应用程序在 Chrome 中无法运行(因此我的问题是),所以也许这是我应该使用 Firebase 提出的一个错误,但无论如何强制长轮询的方法都会(大概)修复我的问题。

【问题讨论】:

  • 如果 WebSockets 不起作用,Firebase 应该自动退回到长轮询,因此控制台错误应该是无害的。应用还能用吗?
  • Anant:它不会依赖 Chrome 中的长轮询。 (所以我不是这种情况stackoverflow.com/questions/12421993/…

标签: javascript websocket firebase angularfire


【解决方案1】:

你可以使用Firebase.INTERNAL.forceLongPolling();强制长轮询Firebase.INTERNAL.forceWebSockets();强制web socket

【讨论】:

  • 注意:我认为在当前版本的 SDK 中这将是 firebase.database.INTERNAL.forceLongPolling()
  • 不再可用。有更新的答案吗?
【解决方案2】:

我确定有更好的方法,但我只是进入 firebase-debug.js 并更改了以下函数:

fb.realtime.WebSocketConnection["isAvailable"] = function() {
  var isOldAndroid = false;
  if(typeof navigator !== "undefined" && navigator.userAgent) {
    var oldAndroidRegex = /Android ([0-9]{0,}\.[0-9]{0,})/;
    var oldAndroidMatch = navigator.userAgent.match(oldAndroidRegex);
    if(oldAndroidMatch && oldAndroidMatch.length > 1) {
      if(parseFloat(oldAndroidMatch[1]) < 4.4) {
        isOldAndroid = true
      }
    }
  }
  return!isOldAndroid && fb.WebSocket !== null && !fb.realtime.WebSocketConnection.forceDisallow_
};

改为阅读:

fb.realtime.WebSocketConnection["isAvailable"] = function() {
  return false
};

这很有效,Chrome 现在会自动进行长轮询,我的应用可以与 Firebase 通信。我对缩小后的 firebase.js 进行了相同的更改,但如果有人可以提出建议,我显然更喜欢一种面向未来的解决方法,而不是这种 hack。

【讨论】:

  • 此解决方案不再与为您公开此功能的较新版本的 firebase 相关。
  • 你好,你能告诉我firebase现在公开的功能是什么吗?我可以使用哪种方法来检查 websockets 是否可用?谢谢
猜你喜欢
  • 2013-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-07
  • 2014-10-18
相关资源
最近更新 更多