2012-08-07 17 views
5

Actualmente estoy alojando tanto mi aplicación de rieles como una aplicación faye-server en Heroku. El servidor faye ha sido clonado desde aquí (https://github.com/ntenisOT/Faye-Heroku-Cedar) y parece estar ejecutándose correctamente. He desactivado websockets, ya que no son compatibles con Heroku. A pesar del reclamo en el sitio de Faye que:Faye en Heroku: Problemas entre dominios

"Los clientes y servidores de Faye admiten de forma transparente la comunicación entre dominios, por lo que su cliente puede conectarse a un servidor en cualquier dominio sin configuración adicional".

Todavía estoy corriendo en este error cuando intento publicar en un canal Faye:

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

He leído sobre CORS y trató de implementar algunas soluciones esbozadas aquí: http://www.tsheffler.com/blog/?p=428 pero hasta el momento no han tenido suerte. Me gustaría saber de alguien que:

1) tiene una aplicación rieles alojado en Heroku 2) Tiene un servidor Faye alojado en Heroku 3) Tiene los dos se comunica correctamente con los demás!

Muchas gracias.

Respuesta

1

Acabo de recibir mi Faye y carriles de aplicaciones alojadas en heroku la comunicación dentro de la última hora o así ... aquí están mis observaciones:

  1. Asegúrate de que tu FAYE_TOKEN esté configurado en todos tus servidores si estás usando una variable env.

  2. Desactivar websockets, que ya has hecho ... client.disable(...) no funcionó, utilicé Faye.Transport.WebSocket.isUsable = function(_,c) { c(false) } en su lugar.

  3. Esto puede o no aplicarse a usted, pero fue lo más difícil de encontrar para mí ... en mi entorno de desarrollo, el puerto en el que se ejecuta mi aplicación se agregará al final del nombre de host especificado para mi servidor faye ... pero esto parecía causar una falla al comunicarse en producción. Trabajé en eso creando un método broadcast_server_uri en application_controller.rb que maneja la inclusión de un puerto cuando sea necesario, y luego lo uso en cualquier lugar en el que haga girar un nuevo canal.

....

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 

Y en mi aplicación Javascript, incluyendo

<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, no destacaría sobre la configuración de Access-Control-Allow-Origin como se no parece estar haciendo una diferencia de ninguna manera: veo XMLHttpRequest cannot load http://... independientemente, pero esto debería funcionar lo suficientemente bien como para desbloquearlo. (aunque me gustaría aprender de una solución más limpia ...)

+0

Hola Soychicka, muchas gracias por esto. Lo estoy viendo ahora. Una pregunta: ¿modificó ApplicationController para su aplicación o creó una para el servidor faye? –

+0

Hmm ... todavía no funciona. La suscripción parece estar bien, pero cuando publico no se recoge. El comando faye.publish ('/ channel', {data: "data"}) envía una POST al servidor faye, pero no parece haber una respuesta. Una pregunta, cuando publique, su carga de solicitud se cifra así: message =% 5B% 7B% 22channel% 22% 3A% 22% 2Ffoo% 22% 2C% 22data% 22% 3A% 7B% 22text% 22% 3A% 22Hi% 20here% 22% 7D% 2C% 22clientId% 22% 3A% 22bqk8vbj7v6j10jqsoogrxr7cn% 22% 2C% 22id% 22% 3A% 221hj9hf41cgaa8m1x3nllu0zyzphv% 22% 7D% 5D –

+0

¿Cómo configuró su servidor faye en heroku? ¿Usaste un repositorio github en particular? –

0

No puedo decir que he utilizado Rails/Faye en Heroku, pero ¿ha probado configurar el encabezado Access-Control-Allow-Origin en algo como Access-Control-Allow-Origin: your-domain.com?

Para la prueba también se puede hacer Access-Control-Allow-Origin: * para ver si eso ayuda

encabezados personalizados

Algunos servicios requieren el uso de cabeceras HTTP adicionales para conectarse a su servidor de Bayeux. Puede agregar estos encabezados utilizando el método setHeader() , y se enviarán si el transporte subyacente admite encabezados definidos por el usuario (actualmente solo sondeos largos).

client.setHeader ('Autorización', 'OAuth abcd-1234');

Fuente: http://faye.jcoglan.com/browser.html

Así que trate client.setHeader('Access-Control-Allow-Origin', '*');

+0

Sí, pero me cuesta un poco averiguar dónde se supone que debo configurar el encabezado Access-Control-Allow-Origin. Intenté hacerlo en mi ApplicationController en mi aplicación Rails, pero eso no pareció funcionar. –

+0

Debería configurarlo en su servidor faye ya que es de donde provienen los datos – arcyqwerty

+0

Así que me gusta: Rails - [ajax] -> Faye - [respuesta con Access-Control-Allow-Origin] -> Rails – arcyqwerty

Cuestiones relacionadas