Сборка React вызывает ошибку CORS, когда в разработке не было проблем

#reactjs #iis #asp.net-core-webapi #npm-run

#reactjs #iis #asp.net-core-webapi #npm-run

Вопрос:

Я создал приложение React (мое первое приложение React) и C#.NET Ядро 3.1 Веб-API, которое передает данные в пользовательский интерфейс. Я развертываю API и приложение React на одном сервере (Windows 10) с портом 3030 для API и портом 3029 для сборки React, которая была сгенерирована при выполнении команды «npm run build». Сайт IIS для пользовательского интерфейса был указан в каталоге сборки.

В моей среде разработки запуск приложения с использованием развернутого API работает, и прокси-сервер не требуется. При развертывании мой экран загружается, но никакие записи не извлекаются с помощью ВЫБОРКИ, и вместо этого возникает ошибка CORS:

 Access to fetch at 'http://localhost:3030/api/checking' from origin 'http://localhost:3029' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. If an opaque response serves your needs, set the request's mode to 'no-cors' to fetch the resource with CORS disabled.
  

Почему это работает при запуске React при разработке из кода Visual Studio с горячей загрузкой и почему это не работает после развертывания? Что еще более важно, как мне заставить это работать?

Код API из Startup.cs

Метод ConfigureServices

 services.AddCors(options => {
    options.AddDefaultPolicy(builder => {
        builder.WithOrigins(Configuration["AppSettings:CorsUrl"])
        .AllowAnyHeader()
        .AllowAnyMethod();
    });
});
  

Метод настройки

 app.UseCors();
  

AppSettings.js код

   "AppSettings": {
    "CorsUrl": "http://localhost:3029"
  }
  

Реагировать

Я сохраняю свой URL-адрес в файле .env на корневом уровне, как показано ниже.

 REACT_APP_API_URL=http://localhost:3030/api/checking
  

Команда React Fetch

В моем checking.js компонент, данные загружаются и выполняется ВЫБОРКА.

 const SERVER_URL=`${process.env.REACT_APP_API_URL}`

function Checking() {
  const [rowData, setRowData] = useState([]);
  const [newData, setNewData] = useState(initialState);
  const [displayModal, setModalDisplay] = useState(false);
  const columnDefinitions = Columns();
  const rowDataRef = useRef(rowData);

  useEffect(() => {
    fetch(SERVER_URL)
      .then((response) => response.json())
      .then((rowData) => {
        setRowData(rowData)
        rowDataRef.current = rowData;
      });
  }, []);
.
.
.
  

Ответ №1:

Вам необходимо установить заголовок Access-Control-Allow-Origin. попробуйте следующие методы для устранения этой ошибки.

1. Очистите свои файлы cookie и добавьте Access-Control-Allow-Origin’: ‘*’ по расширению заголовка Mod и повторите попытку, чтобы проверить исправление.

2. Попробуйте использовать промежуточный интерфейс для управления вашим запросом и направлять их в специальные правила.

  app.use((req, res, next) => {
          res.header('Access-Control-Allow-Origin', '*');
          next();
        });
  

Комментарии:

1. Привет @samwu — не могли бы вы объяснить, почему это не было необходимо в среде разработки? Я также немного запутался в реализации этого. Что такое приложение в вашем примере? Это часть команды ВЫБОРКИ?

2. @sawwu, пожалуйста, посмотрите на мои настройки API — я разрешаю приложению react доступ к порту 3029. Это то, что заставило режим разработки работать без прокси. Что вызывает недоумение, так это то, почему производство не работает. Есть ли какая-то волшебная настройка в сборке запуска npm, которая необходима для выполнения этой работы?

Ответ №2:

Оказывается, я заметил неправильное поведение компонента (ag-grid), и это заставило меня запустить обновление npm. Как только это было завершено, я повторно запустил сборку, и теперь все работает. Я считаю, что обновление «исправило» проблему.