我目前在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上进行了通信……这是我的观察结果:
client.disable(...)
对我不起作用,我改用了Faye.Transport.WebSocket.isUsable = function(_,c) { c(false) }
。 ....
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://...
,但这仍然可以很好地使您不受阻碍。 (尽管我很想学习更清洁的解决方案...)