2012-08-07 34 views
5

Tôi hiện đang lưu trữ cả ứng dụng đường ray và ứng dụng faye-server trên Heroku. Máy chủ faye đã được sao chép từ đây (https://github.com/ntenisOT/Faye-Heroku-Cedar) và có vẻ như đang chạy chính xác. Tôi đã tắt các ổ cắm web vì chúng không được hỗ trợ trên Heroku. Mặc dù tuyên bố trên trang web của Faye rằng:Faye on Heroku: Các vấn đề liên quan đến tên miền

"Khách hàng và máy chủ Faye hỗ trợ minh bạch tên miền chéo, vì vậy khách hàng của bạn có thể kết nối với máy chủ trên bất kỳ miền nào bạn thích mà không cần cấu hình thêm."

tôi vẫn gặp phải lỗi này khi tôi cố gắng để gửi đến một kênh faye:

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

Tôi đã đọc về CORS và cố gắng thực hiện một số giải pháp được nêu ở đây: http://www.tsheffler.com/blog/?p=428 nhưng cho đến nay không có may mắn. Tôi muốn nghe từ một người:

1) Có ứng dụng đường ray được lưu trữ trên Heroku 2) Có máy chủ faye được lưu trữ trên Heroku 3) Có hai người trong số họ liên lạc thành công với nhau không!

Cảm ơn rất nhiều.

Trả lời

1

Tôi chỉ có faye tôi và đường ray ứng dụng được lưu trữ trên Heroku giao tiếp trong vòng một giờ quá khứ hay như vậy ... đây là những quan sát của tôi:

  1. Đảm bảo FAYE_TOKEN của bạn được đặt trên tất cả các máy chủ của bạn nếu bạn đang sử dụng biến env.

  2. Tắt các ổ cắm web mà bạn đã thực hiện ... client.disable(...) không hoạt động đối với tôi, tôi đã sử dụng Faye.Transport.WebSocket.isUsable = function(_,c) { c(false) } để thay thế.

  3. Điều này có thể hoặc không áp dụng cho bạn, nhưng là điều khó khăn nhất để theo dõi tôi ... trong môi trường dev của tôi, cổng mà ứng dụng của tôi đang chạy sẽ được gắn vào cuối tên máy chủ được chỉ định cho máy chủ faye của tôi ... nhưng điều này dường như gây ra sự thất bại trong giao tiếp trong sản xuất. Tôi đã làm việc xung quanh đó bằng cách tạo một phương thức broadcast_server_uri trong application_controller.rb để xử lý sự bao gồm của một cổng khi cần thiết, và sau đó sử dụng bất cứ nơi nào tôi quay lên một kênh mới.

....

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 

Và trong javascript ứng dụng của tôi, trong đó có

<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, tôi sẽ không nhấn mạnh về việc thiết Access-Control-Allow-Origin vì nó dường như không tạo ra sự khác biệt theo cách nào - tôi thấy XMLHttpRequest cannot load http://... bất kể nhưng điều này vẫn hoạt động tốt đủ để giúp bạn bỏ chặn. (mặc dù tôi rất muốn tìm hiểu về giải pháp sạch hơn ...)

+0

Hi Soychicka, cảm ơn rất nhiều vì điều này. Tôi đang kiểm tra nó ra ngay bây giờ. Một câu hỏi, bạn đã sửa đổi ApplicationController cho ứng dụng của bạn hay tạo một ứng dụng cho máy chủ faye? –

+0

Hmm ... vẫn không hoạt động. Các thuê bao có vẻ là tốt, nhưng khi tôi xuất bản nó không được chọn. Lệnh faye.publish ('/ channel', {data: "data"}) gửi POST tới máy chủ faye, nhưng dường như không có phản hồi. Một câu hỏi, khi bạn đăng bài, yêu cầu tải trọng của bạn được mã hóa như thế này: message =% 5B% 7B% 22 channel% 22% 3A% 22% 2Ffoo% 22% 2C% 22data% 22% 3A% 7B% 22text% 22% 3A% 22Hi% 20there% 22% 7D% 2C% 22clientId% 22% 3A% 22bqk8vbj7v6j10jqsoogrxr7cn% 22% 2C% 22id% 22% 3A% 221hj9hf41cgaa8m1x3nllu0zyzphv% 22% 7D% 5D –

+0

Bạn đã thiết lập máy chủ faye trên heroku như thế nào? Bạn đã sử dụng một repo github cụ thể? –

0

Không thể nói tôi đã sử dụng Rails/Faye trên Heroku nhưng bạn đã thử đặt tiêu đề Access-Control-Allow-Origin thành một cái gì đó như Access-Control-Allow-Origin: your-domain.com?

Đối với thử nghiệm bạn cũng có thể làm Access-Control-Allow-Origin: * để xem nếu điều đó giúp

Tiêu đề tùy chỉnh

Một số dịch vụ đòi hỏi việc sử dụng các tiêu đề HTTP bổ sung để kết nối với máy chủ Bayeux của họ. Bạn có thể thêm các tiêu đề này bằng cách sử dụng phương thức setHeader() và chúng sẽ được gửi nếu phương tiện cơ bản hỗ trợ tiêu đề do người dùng xác định (hiện chỉ đang bỏ phiếu dài).

client.setHeader ('Ủy quyền', 'OAuth abcd-1234');

Nguồn: http://faye.jcoglan.com/browser.html

Vì vậy, cố gắng client.setHeader('Access-Control-Allow-Origin', '*');

+0

Có, nhưng tôi gặp một chút khó khăn trong việc tìm ra nơi tôi phải đặt tiêu đề Access-Control-Allow-Origin. Tôi đã cố gắng để làm như vậy trong ApplicationController của tôi trên ứng dụng đường ray của tôi, nhưng điều đó dường như không hoạt động. –

+0

Bạn nên đặt nó trên máy chủ faye của bạn từ đó dữ liệu đến từ – arcyqwerty

+0

Vì vậy, như: Đường ray - [ajax] -> Faye - [phản hồi với Access-Control-Allow-Origin] -> Rails – arcyqwerty

Các vấn đề liên quan