Как делать запросы к локальному приложению Rails из локального приложения AngularJS, работающего на другом порту?

Я разрабатываю веб-приложение с интерфейсом AngularJS и бэкэндом Rails.

Моя цель состоит в том, чтобы полностью разделить их, поскольку приложение Rails в конечном итоге будет переведено на простой сервер REST, а интерфейс AngularJS будет лишь одним из нескольких различных клиентов, использующих серверную часть. По этой причине я не хочу интегрировать интерфейс в конвейер ресурсов Rails или что-то подобное.

Приложение Rails работает локально на порту 3000. Внешний интерфейс использует Gulp для компиляции статических ресурсов и BrowserSync, который содержит сервер разработки, который я запускаю на порту 3001.

В целях разработки, как я могу заставить приложение AngularJS общаться с сервером Rails, избегая этой ошибки браузера (которую я ожидал) при выполнении HTTP-запроса через https://docs.angularjs.org/?

No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost:3001' is therefore not allowed access.

Мне просто нужно настроить CORS в приложении Rails? Есть ли другой способ - может быть, какой-то трюк с файлами локальных хостов (я на Mac, FWIW) или что-то подобное? Я спрашиваю, потому что мой коллега отвечает за приложение Rails (у меня ограниченный опыт работы с Rails), но какое-то время его нет в городе; мои знания в основном ограничены стеком AngularJS, который я настроил.

Я искал и читал около часа, но пока не смог найти ничего, что можно было бы найти, что применимо к моей ситуации. Возможно, я не знаю лучших условий поиска.

Спасибо за любую помощь!


person Bungle    schedule 28.12.2014    source источник
comment
Одним из простых способов было бы статически обслуживать index.html вашего приложения Angular из того же домена/порта, то есть http://localhost:3000   -  person New Dev    schedule 28.12.2014
comment
Спасибо @NewDev, но я не уверен, что это возможно? См. stackoverflow. ком/вопросы/1694144/. Я попытался настроить BrowserSync для использования порта 3000, но оказалось, что он разумно понимает, что порт занят (приложением Rails), и автоматически переходит к следующему доступному порту, 3001. Пожалуйста, дайте мне знать, если вы знаю способ сделать это, что мне не хватает.   -  person Bungle    schedule 28.12.2014
comment
Я имел в виду использовать это как статический файл из приложения Rails - (2) в ответе ниже.   -  person New Dev    schedule 28.12.2014


Ответы (1)


Ах, замечательно. Вот несколько решений:

  1. настроить CORS, что не должно быть слишком сложно. Все, что вам нужно сделать, это добавить заголовки к страницам, обслуживающим ваш статический контент (а не к конечным точкам REST REST). Проблема в том, что вы не должны этого делать, если у вас нет веской причины (см. 3). Как вы обслуживаете статический контент? Должны быть плагины для создания заголовков, если это популярный инструмент.
  2. пока обслуживайте страницы angularJS из бэкэнда rails (используя какой-то статический маршрут)
  3. если вы думаете о производстве и хотите разобраться с этим навсегда, используйте nginx для проксирования двух сервисов в один домен, http://nginx.org/en/docs/beginners_guide.html
person Peter Ashwell    schedule 28.12.2014
comment
Спасибо за помощь, Петр! Я согласился с вашим третьим предложением, но пока оставил его локальным (хотя я ожидаю, что в конечном итоге мы будем использовать аналогичный подход для производства). В основном это работает, но есть несколько сбоев, которые могут быть связаны или не связаны с nginx. Я начал отдельный вопрос о них - был бы признателен за ваш вклад, если у вас есть время. stackoverflow.com/questions/27713016/ - person Bungle; 31.12.2014