推送消息未接收到。

4

我按照几个类似的教程(看起来都很相似)使用Pusher为我的Rails应用程序实现实时消息传递。

我正在尝试的内容:

// Javascript on my clientside receiving html page
$(function(){
  var pusher = new Pusher('xxxx-mykey-xxxx');
  var myChannel = pusher.subscribe('survey-channel');

  myChannel.bind('data-changed', function(data){ 
           alert(data);
      });
  // Some useful debug msgs
  pusher.connection.bind('connecting', function() {
      alert('Connecting to Pusher...');
    });
    pusher.connection.bind('connected', function() {
      alert('Connected to Pusher!');
    });
    pusher.connection.bind('failed', function() {
      alert('Connection to Pusher failed :(');
    });
    myChannel.bind('subscription_error', function(status) {
      alert('Pusher subscription_error');
    });
});

在我的Rails应用程序中,我将其包含在控制器方法内:
Pusher['survey-channel'].trigger('data-changed', "Busy creating new Call") 
render :text => "Pusher sent"

当该方法被调用时,除了呈现“Pusher sent”之外,没有其他内容发生。
在我的Chrome开发者工具控制台中,我得到以下内容:
(x) Uncaught TypeError: Cannot call method 'bind' of undefined calls:31
(3) WebSocket is closed before the connection is established. :3000:1

我可能漏掉了什么?请帮忙!

编辑 #1

我在客户端添加了这段代码:

Pusher.log = function(message) {
  if (window.console && window.console.log) window.console.log(message);
};

然后它将以下内容记录到控制台:

Pusher : Connecting : ws://ws.pusherapp.com:80/app/e5d0f1ae2cab03dc3aa9?client=js&version=1.8.6 calls:44    
Pusher : Event recd (event,data) : pusher:connection_established : {"socket_id":"14299.674628"} calls:44    
Pusher : Event sent (channel,event,data) :  : pusher:subscribe : {"channel":"survey-channel"} calls:44

编辑 #2

每当我发送“消息”时,即使我使用事件创建器发送它,它也不会出现在Pusher的调试控制台中。但真正奇怪的是,在统计信息页面上,它指示消息速率连接数大于零,例如 2个连接等。


编辑 #3

我已经测试了Pusher的测试页面。(http://test.pusher.com/1.12) 它可以完美连接,但“Say Hello”功能没有任何作用。这让我想到可能是我的浏览器设置问题。

我当前在Win7 PC上运行最新版本的Chrome浏览器。


你是否在使用一些网络开发代理工具?我注意到当我使用Charles时,Pusher消息无法到达(Chrome/OSX)。 - Yaniv Aknin
@YanivAknin 不,我没有。我通过在JavaScript中使用encryption:true来初始化我的Pusher实例来解决了我的问题。var pusher = new Pusher('mykey', { encrypted: true }); - Pangolin
1个回答

4

识别问题的步骤:

Gem日志记录

当您启用日志记录时,宝石提供了哪些信息?可能是您的凭据不正确。

虽然这不是强制性的,但建议您将JSON发送到Pusher。因此,如果您将trigger调用更新如下,宝石将把对象转换为JSON:

Pusher['survey-channel'].trigger('data-changed', { :text => "Busy creating new Call" } )

从JavaScript客户端(浏览器)连接到Pusher

Pusher连接常见问题解答提供了有关连接到Pusher时可能遇到的问题和常见解决方案的信息。

Pusher调试控制台

Pusher调试控制台为您提供有关Pusher中应用程序内发生的情况的信息。在这种情况下,它将让您知道消息是否到达Pusher。您可以通过查看应用程序的<head>标签来实现此目的。

如果消息已到达Pusher,则下一步是了解为什么事件未到达您的客户端。

我在代码中没有发现其他错误,但是调试控制台可能会提供更多信息,我将能够从那里更新我的答案。

有关您问题的一些附加信息:

看起来您正在尝试绑定到Pusher事件:

myChannel.bind('subscription_error', function(status) {
  alert('Pusher subscription_error');
});

但是这样做是没有任何效果的,原因如下:
  1. 该频道是公共频道,所以不会出现订阅错误
  2. 事件名称不正确。如果它是一个私有或存在频道,并且使用了用户认证机制,那么你可以绑定到http://pusher.com/docs/client_api_guide/client_events#subscription_error事件,注意pusher:前缀。

(x) Uncaught TypeError: Cannot call method 'bind' of undefined calls:31

这个错误意味着你在一个未定义的变量上调用bind方法。这是一个常见的脚本错误。

(3) WebSocket is closed before the connection is established. :3000:1

这意味着连接时出现了问题。Pusher JavaScript库将处理此问题并尝试重新连接。不幸的是,无法捕获此类错误,Chrome将其记录到JavaScript控制台中。这给人留下了永久损坏的印象,但实际上并非如此。

我已经测试过Pusher的测试页面。(http://test.pusher.com/1.12) 它连接得很好,但"Say Hello"功能没有任何作用。这让我想可能是我的浏览器设置的问题。

我当前在Win7 PC上运行最新版本的Chrome。

如果你尝试http://test.pusher.com/1.12?ssl=true,你可能会收到“hello”消息。很有可能你安装了一个干扰WebSocket连接的反病毒软件。使用SSL(WSS)进行连接意味着反病毒软件无法篡改连接数据。


我尝试了Pusher的调试控制台,但是虽然统计数据显示“消息”和“连接”,但没有任何东西出现。我还尝试了他们的事件创建器,但是通过它发送的消息在调试控制台中也没有出现。 - Pangolin
谢谢。更新您的问题以澄清这一点是值得的。 - leggetter
很快就会开始您的调试步骤。 - Pangolin
我已经添加了一个“从JavaScript客户端连接到Pusher”的功能。如果您希望快速了解发生了什么,我建议您前往http://pusher-diagnostics.herokuapp.com并将结果发送给Pusher支持。 - leggetter
我已在我的iPhone上通过3G进行了测试,它可以正常工作。(我的应用程序和测试版本为1.12) 这意味着问题可能出现在我的PC所在的网络上的套接字,或者是防火墙等。下一步测试将是确定是我的PC还是整个网络的问题。 - Pangolin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接