2012-08-07 87 views
5

我目前在Heroku上託管我的rails應用程序和faye-server應用程序。從這裏(https://github.com/ntenisOT/Faye-Heroku-Cedar)克隆了faye服務器,似乎運行正常。我禁用了Websocket,因爲Heroku不支持它們。儘管在王菲的網站聲稱:在Heroku上的Faye:跨域問題

「王菲客戶端和服務器透明地支持跨域通信,所以您的客戶端可以連接到你喜歡而無需進一步配置任何域中的服務器。」

我仍然運行到這個錯誤,當我嘗試發佈到王菲道:

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 2一個Rails應用程序)主辦在Heroku 3王菲服務器)有他們兩個相互交流成功!

非常感謝。

回答

1

我只是得到我的王菲和軌道託管在Heroku在過去一小時左右的時間內進行通信的應用程序...這裏是我的意見:

  1. 如果您使用的是env變量,請確保您的所有服務器上都設置了FAYE_TOKEN。

  2. 禁用websockets,你已經完成了... client.disable(...)沒有爲我工作,我用Faye.Transport.WebSocket.isUsable = function(_,c) { c(false) }來代替。

  3. 這可能適用於您,但是最難追查到我......在我的開發環境中,我的應用程序運行的端口將被添加到指定主機名的末尾我的faye服務器......但這似乎導致在生產中無法通信。我通過在application_controller.rb中創建一個broadcast_server_uri方法來解決這個問題,該方法在必要時處理包含端口的內容,然後在任何地方使用該函數啓動一個新頻道。

....

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,我不會強調有關設置訪問控制允許來源,因爲它似乎沒有任何區別 - 我看到XMLHttpRequest cannot load http://...無論如何,但這應該仍然運作良好,讓你暢通無阻。 (雖然我很想學習更清潔的解決方案......)

+0

嗨Soychicka,非常感謝這一點。我正在查看它。有一個問題,你是否修改了應用程序的ApplicationController或者爲faye服務器創建了一個? – 2012-08-07 23:01:37

+0

嗯...仍然沒有工作。訂閱似乎沒有問題,但是當我發佈時,它並沒有被收錄。 faye.publish('/ channel',{data:「data」})命令確實向POST服務器發送POST消息,但似乎沒有迴應。有一個問題,當你發佈時,你的請求負載是這樣加密的:message =%5B%7B%22channel%22%3A%22%2Ffoo%22%2C%22data%22%3A%7B%22text%22%3A% 22Hi%20%22%7D%2C%22clientId%22%3A%22bqk8vbj7v6j10jqsoogrxr7cn%22%2C%22id%22%3A%221hj9hf41cgaa8m1x3nllu0zyzphv%22%7D%5D – 2012-08-07 23:50:17

+0

你是如何在heroku上設置你的faye服務器的?你有沒有使用特定的github回購? – 2012-08-08 00:33:48

0

不能說我已經在Heroku上使用過Rails/Faye,但是您是否嘗試過將Access-Control-Allow-Origin標頭設置爲Access-Control-Allow-Origin: your-domain.com

測試你也可以做Access-Control-Allow-Origin: *,看看有沒有什麼幫助

自定義頁眉

一些服務需要使用額外的HTTP標頭連接到 他們的貝葉服務器。您可以使用setHeader() 方法添加這些標頭,如果底層傳輸支持 用戶定義的標頭(僅限當前長輪詢),它們將被髮送。

client.setHeader( '授權', '的OAuth ABCD-1234');

來源:http://faye.jcoglan.com/browser.html

所以儘量client.setHeader('Access-Control-Allow-Origin', '*');

+0

是的,但我在確定應設置Access-Control-Allow-Origin標頭的位置時遇到了一些問題。我試圖在我的Rails應用程序的ApplicationController中這樣做,但這似乎不起作用。 – 2012-08-07 17:47:13

+0

你應該將它設置在你的faye服務器上,因爲那裏的數據來自於 – arcyqwerty 2012-08-07 17:58:53

+0

所以像:Rails - [ajax] - > Faye - [使用Access-Control-Allow-Origin的響應] - > Rails – arcyqwerty 2012-08-07 17:59:38