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)