В настоящее время я читаю "Pro AngularJS" Адама Фримена. Просматривая примеры, он предлагает читателю создать приложение для спортивного магазина, используя Angular (конечно) с ресурсом сервера Deployd. Ресурс Deployd настроен для возврата данных JSON, которые должны быть заполнены в модели. Я использую NodeJS для запуска моего сервера. В настоящее время он настроен на порт 5000 (http://localhost:5000/sportsstore/app.html
). Ресурс Deployd работает на порту 5500 (http://localhost:5500/products
). При нажатии Deployd ответ выглядит следующим образом:
[
{ "name": "Kayak", "description": "A boat for one person", "category": "Watersports", "price": 275, "id": "a1c999fc248b2959" },
{ "name": "Lifejacket", "description": "Protective and fashionable", "category": "Watersports", "price": 48.95, "id": "61303717cfad182e" },
{ "name": "Soccer Ball", "description": "FIFA-approved size and weight", "category": "Soccer", "price": 19.5, "id": "0fb5f67bdcbd992f" },
{ "name": "Corner Flags", "description": "Give your playing field a professional touch", "category": "Soccer", "price": 34.95, "id": "24385d315dd388b4" },
{ "name": "Stadium", "description": "Flat-packed 35,000-seat stadium", "category": "Soccer", "price": 79500, "id": "500fb6805905a856" },
{ "name": "Thinking Cap", "description": "Improve your brain efficiency by 75%", "category": "Chess", "price": 16, "id": "637d8a1f42e6fa1c" },
{ "name": "Unsteady Chair", "description": "Secretly give your opponent a disadvantage", "category": "Chess", "price": 29.95, "id": "73393312ec7dfab7" },
{ "name": "Human Chess Board", "description": "A fun game for the family", "category": "Chess", "price": 75, "id": "7871d02a662b0915" },
{ "name": "Bling-Bling King", "description": "Gold plated, diamon-studded King", "category": "Chess", "price": 1200, "id": "b59a3389a0e248bd" }
]
Я пытаюсь извлечь эти данные с помощью $http.get
:
$http.get("http://localhost:5500/products")
.success(function (data) { ... })
.error(function (error) { ... });
Однако это продолжает возвращать ошибку:
XMLHttpRequest cannot load http://localhost:5500/products. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:5000' is therefore not allowed access.
Исследование показывает, что есть/были некоторые проблемы с Angular и CORS, и что заголовки должны были быть настроены для выполнения междоменных запросов. В результате я добавил в свой app.config следующее:
$http.defaults.useXDomain = true;
delete $http.defaults.headers.common['X-Requested-With']; // this isn't needed anymore, but was put here as a just-in-case
Несмотря на то, что эти настройки добавлены, я все еще получаю ошибку. В документации Deployd указано, что она автоматически настроена для CORS (Запросы на перекрестный поиск) и отправит соответствующую информацию заголовка, если запрос не содержит недопустимых пользовательских заголовков. Я уверен, что мой запрос не содержит недопустимых пользовательских заголовков:
Accept: application/json, text/plain, */*
Cache-Control: max-age=0
Origin: http://localhost:5000
Referer: http://localhost:5000/sportsstore/app.html
User-Agent: Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0.1847.131 Safari/537.36
Мой вопрос: есть ли какая-то другая конфигурация, которую мне нужно установить, чтобы настроить Deployd, чтобы разрешить запрос CORS? В книге не указаны какие-либо специальные настройки заголовка Angular или что-то еще.