我目前在Heroku上同时托管我的rails应用程序和faye-server应用程序。 faye服务器已从此处(https://github.com/ntenisOT/Faye-Heroku-Cedar)克隆,并且似乎运行正常。我禁用了websocket,因为Heroku不支持它们。尽管在Faye的网站上声称:

“Faye客户端和服务器透明地支持跨域通信,因此您的客户端可以连接到您喜欢的任何域上的服务器,而无需进一步配置。”

当我尝试发布到faye channel 时,我仍然遇到此错误:

    XMLHttpRequest cannot load http://MYFAYESERVER.herokuapp.com. Origin http://MYAPPURL.herokuapp.com is not allowed by Access-Control-Allow-Origin.

我已经阅读了有关CORS的信息,并尝试实现此处概述的一些解决方案:http://www.tsheffler.com/blog/?p=428,但到目前为止还没有运气。我希望收到以下人的来信:

1)在Heroku上托管了Rails应用
2)在Heroku上托管了faye服务器
3)他们两个成功地互相交流了!

非常感谢。

最佳答案

在过去的大约一个小时内,我刚刚将我的faye和rails应用托管在heroku上进行了通信……这是我的观察结果:

  • 如果您使用env变量,请确保在所有服务器上都设置了FAYE_TOKEN。
  • 禁用websocket,您已经完成了... client.disable(...)对我不起作用,我改用了Faye.Transport.WebSocket.isUsable = function(_,c) { c(false) }
  • 这可能适用于您,也可能不适用于您,但对于我而言,这是最难的事情……在我的开发环境中,运行我的应用程序的端口将被固定在我的faye服务器的指定主机名的末尾。 ..但这似乎导致生产中的通信失败。我通过在application_controller.rb中创建一个broadcast_server_uri方法来解决此问题,该方法在必要时处理端口的包含,然后在启动新 channel 的任何地方使用该方法。

  • ....
    class ApplicationController < ActionController::Base
      def broadcast_server
          if request.port.to_i != 80
            "http://my-faye-server.herokuapp.com:80/faye"
          else
            "http://my-faye-server.herokuapp.com/faye"
          end
      end
      helper_method :broadcast_server
    
      def broadcast_message(channel, data)
        message = { :ext => {:auth_token => FAYE_TOKEN}, :channel => channel, :data => data}
        uri = URI.parse(broadcast_server)
        Net::HTTP.post_form(uri, :message => message.to_json)
      end
    
    
    end
    

    在我的应用程序javascript中,包括
    <script>
      var broadcast_server = "<%= broadcast_server %>"
      var faye;
    $(function() {
        faye = new Faye.Client(broadcast_server);
        faye.setHeader('Access-Control-Allow-Origin', '*');
        faye.connect();
        Faye.Transport.WebSocket.isUsable = function(_,c) { c(false) }
    
          // spin off your subscriptions here
      });
    </script>
    

    FWIW,我不会为设置Access-Control-Allow-Origin感到压力,因为这两种方式似乎都没有什么不同-无论如何我都看到XMLHttpRequest cannot load http://...,但这仍然可以很好地使您不受阻碍。 (尽管我很想学习更清洁的解决方案...)

    10-08 16:50