Приложение Angular 7 получает ошибку CORS от углового клиента - PullRequest
0 голосов
/ 26 ноября 2018

Я разработал угловое 7 приложение с экспресс-бэкендом.Экспресс работает на localhost:3000, а угловой клиент работает на localhost: 4200.

В server.js у меня есть (не весь код)

const app = express();
// Enable CORS
app.use(cors());
// Get our API routes
const api = require('./api');
// Set our api routes
app.use('/api', api);
app.use(express.static(__dirname + '/dist/sfdc-event'));

В файле api.js, У меня есть router.get ('/ oauth2 / login'), который перенаправляет на https://example.com, который отправляет токен доступа и аутентифицирует пользователя (аутентификация OAuth2).

Когда я вызываю URL http://localhost:3000/api/oauth2/login все работает нормально, но когда я пытаюсь сделать то же самое из angular component.ts -> service.ts, я получаю следующую ошибку.

Блокировка перекрестного запроса: Та же политика происхождения запрещает чтение удаленного ресурса. Причина: отсутствует заголовок CORS «Access-Control-Allow-Origin»

Угловой поток приложения следующим образом login.component.ts, в котором есть кнопка, вызывающая службуapi.service.ts, который выполняет http get.

login.component.ts

sfdcLogin(): void {
  console.log('DEBUG: LoginComponent: ', 'Login button clicked..');
 this.apiService.login().subscribe( data => { console.log( data ); });
}

api.service.ts

login() {
  console.log('DEBUG: APiService login(): ', 'login() function.');
  const URL = 'oauth2/login';
  console.log('DEBUG: ApiService login URL : ', `${environment.baseUrl}/${URL}`.toString());
  return this.http.get(`${environment.baseUrl}/${URL}`)
    .pipe( map( res => res ));
}

Может кто-нибудь помочь мне обойти ошибку?У меня есть а) CORS б) обслуживание статических файлов из server.js как

app.use(express.static(__dirname + '/dist/sfdc-event'));

в) переменная динамического окружения.Что еще мне не хватает?

Ответы [ 7 ]

0 голосов
/ 26 марта 2019

Я работал с Angle Cli и .net Framework на стороне сервера.

Чтобы решить эту проблему, я просто включил взаимодействие CORS на стороне сервера, используяследующие шаги:

  1. Install-Package Microsoft.AspNet.WebApi.Cors -Version 5.2.6

    А затем в класс WebApiConfig:

  2. Добавить using System.Web.Http.Cors;

  3. Метод внутреннего регистра (конфигурация HttpConfiguration):

var cors = new EnableCorsAttribute("http://localhost:4200", "*", "*");

config.EnableCors(cors);

или

var cors = new EnableCorsAttribute("*", "*", "*"); //origin, headers, methods

config.EnableCors(cors);
0 голосов
/ 02 июня 2019

Я знаю, что на этот вопрос уже дан ответ, но он может помочь кому-то, кто ищет проблему с CORS.Вы можете выполнить следующие 3 шага, чтобы решить эту проблему.1. Создайте файл proxy.conf.json и поместите его на корневой уровень вашего приложения.2. В файле package.json добавьте параметр прокси в ngstart 3. В angular.json добавьте запись в файл прокси.4. Измените все остальные вызовы на что-то вроде /api/getData.

Полный пошаговый учебник приведен здесь.http://www.codeyourthought.com/angular/proxy-to-make-http-call-in-angular/

0 голосов
/ 10 марта 2019

Чтобы переадресовать все вызовы для http://localhost:4200/api на сервер, работающий на http://localhost:3000/api, выполните следующие шаги.

  1. Создайте файл proxy.conf.json в папке проектов src / рядом с package.json.

  2. Добавьте следующее содержимое в новый файл прокси:

    {"/ api": {"target ":" http://localhost:3000 "," secure ": false}}

  3. В файле конфигурации CLI angular.json добавьте параметр proxyConfig к цели обслуживания:

    ... "architect": {"serve": {"builder": "@ angular-devkit / build-angular: dev-server", "options": {"browserTarget": "your-application-name: build "," proxyConfig ":" src / proxy.conf.json "}, ...

  4. Чтобы запустить сервер dev с этой конфигурацией прокси, вызовите ng serve.

0 голосов
/ 07 декабря 2018

Для Angular 7 вы должны сделать другую реализацию.Из угловой документации вы должны создать файл proxy.js:

https://angular.io/guide/build#using-corporate-proxy

Изменить путь для вашего собственного внутреннего сервера.

proxy.js:

var HttpsProxyAgent = require('https-proxy-agent');
var proxyConfig = [{
  context: '/api',
  target: 'http://your-remote-server.com:3000',
  secure: false
}];

function setupForCorporateProxy(proxyConfig) {
  var proxyServer = process.env.http_proxy || process.env.HTTP_PROXY;
  if (proxyServer) {
    var agent = new HttpsProxyAgent(proxyServer);
    console.log('Using corporate proxy server: ' + proxyServer);
    proxyConfig.forEach(function(entry) {
      entry.agent = agent;
    });
  }
  return proxyConfig;
}

module.exports = setupForCorporateProxy(proxyConfig);

Позже добавьте это в свой package.json

"start": "ng serve --proxy-config proxy.js"

И назовите это с помощью:

npm start

А в вашем app.js простодобавить:

const cors = require("cors");
app.use(cors());

У меня была та же проблема, и это решило мою проблему.Надеюсь, это поможет!

0 голосов
/ 28 ноября 2018

Я изменил механизм обратного вызова, чтобы обойти проблему CORS. Я использую поток OAuth для аутентификации пользователя с https://example.com, который перенаправлял на https://example.com/auth/callback, Я инициировал запрос отhttp://localhost:4200 и затем отправка URL-адреса обратного вызова на сервер http://localhost:3000, и я получаю сообщение об ошибке CORS.

Теперь я перенаправляю его клиенту http://localhost:4200и справился с проблемой CORS.Все остальные вызовы GET, POST, DELETE, PATCH поступают с http://localhost:3000, который работает нормально.

Спасибо всем за ваш вклад.

0 голосов
/ 26 ноября 2018

Если это только для разработки, я рекомендую использовать прокси, который поставляется с angular-cli.Создайте файл с именем proxy.json

и

{
  "/api/oauth2/login": {
    "target": "http://localhost:3000/api/oauth2/login",
    "secure": false
  }
}

и вызовом ng serve --proxy-config proxy.json.Если вы ожидаете, что это все еще проблема в производстве, тогда нам нужно побольше поговорить.

Полная документация: https://github.com/angular/angular-cli/blob/master/docs/documentation/stories/proxy.md

И что такое CORS точно: https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS

0 голосов
/ 26 ноября 2018

Поскольку ваше угловое приложение работает на порте 4200, а серверная часть работает на порте 3000, источник обоих приложений различен.

Чтобы решить эту проблему, вы можете настроить «nginx» на своем компьютере.

При этом все ваши запросы от angular и backend будут проходить через сервер "nginx".Таким образом, решается проблема CORS.

...