Rails: У меня работает Faye, но все равно выдает ошибку JS в консоли по неизвестной причине. Должен ли я волноваться?

Я использую гем Private_Pub, который построен на Faye, и использую другое приложение для Faye, которое предоставлено этим блогом для проекта, который я нашел. чтобы Фэй запустила приложение, а мой действительный сайт - в другом приложении.

Ошибка в консоли FireFox:

The connection to ws://xxxxxxxxxxx.herokuapp.com/faye was interrupted while the page was loading. Faye.js

и в Chrome:

WebSocket connection to 'ws://xxxxxxxxxxx.herokuapp.com/faye' failed: One or more reserved bits are on: reserved1 = 1, reserved2 = 0, reserved3 = 0 

в журнале приложения Chat (Faye) я получаю это в журнале:

at=error code=H12 desc="Request timeout" method=GET path=/faye host=xxxxxxxxxxx.herokuapp.com request_id=xxxxxxxxxxx fwd="xxxxxxxxxxx" dyno=web.1 connect=31ms service=30112ms status=503 bytes=0

какие-либо предложения:?

Я добавил after_filter в application_controller а также разрешить запрос домена

2 ответа

Решение

Чтобы решить эту проблему, Rails Apps нужно позволить друг другу доступ или скажем пинговать друг друга. Чтобы сделать это, мы должны использовать что-то вроде CORS, чтобы разрешить AJAX-запрос от другого домена. Вот более простой способ, который я использовал, чтобы разрешить доступ к методу, на первый взгляд это может показаться странным.

Чтобы выполнить это с обеих сторон, вам нужно создать собственно полное приложение для Faye Кроме того, в отличие от того, что указано на Repo-сервере чата Faye, который я прикрепил в своем вопросе.

  • Шаг 1:

В приложении Actual/Main включите это в свой application_controller.rb

  before_filter :cors_preflight_check
  after_filter :cors_set_access_control_headers
  #For all responses in this controller, return the CORS access control headers.
  def cors_set_access_control_headers
    headers['Access-Control-Allow-Origin'] = 'http://YOURFAYEAPP.com'
    headers['Access-Control-Allow-Methods'] = 'POST, PUT, DELETE, GET, OPTIONS'
    headers['Access-Control-Request-Method'] = 'http://YOURFAYEAPP.com'
    headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization'
  end
  # If this is a preflight OPTIONS request, then short-circuit the
  # request, return only the necessary headers and return an empty
  # text/plain.
  def cors_preflight_check
    if request.method == :options
      headers['Access-Control-Allow-Origin'] = 'http://YOURFAYEAPP.com'
      headers['Access-Control-Allow-Methods'] = 'POST, PUT, DELETE, GET, OPTIONS'
      headers['Access-Control-Request-Method'] = 'http://YOURFAYEAPP.com'
      headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept, Authorization'
      render :text => '', :content_type => 'text/plain'
    end
end
  • Шаг 2:

    на стороне приложения Faye включают то же самое в application_controller.rb, но измените имя домена на приложение Original/Actual/Main Rails.

Таким образом, оба могут отправлять и получать запросы. Не ставь * вместо запроса parameter Это проблема безопасности. Вы можете сократить methods только Get а также Post,

Это было проблемой и для моего приложения, у heroku установлен тайм-аут 30, и если для faye.ru/config.ru установлено тайм-аут больше 30, эта ошибка возникнет. попробуйте уменьшить его до 25 или около того.faye_server = Faye::RackAdapter.new(:mount => '/faye', :timeout => 25)

Другие вопросы по тегам