Остановить XHR, отвечающий на запрос OPTIONS - PullRequest
0 голосов
/ 05 февраля 2019

Я создаю API, который будет размещен в функциях Azure, и веб-приложение, которое будет размещено в хранилище BLOB-объектов Azure.Это означает, что мой API должен отвечать на запросы OPTIONS от браузера пользователя (что не является проблемой при использовании Postman или Curl).

Мой API отвечает соответствующим образом на запросы OPTIONS, поэтому это устраняет любые проблемы CORS.

Проблема возникает, когда сервер отвечает на ОПЦИИ на стороне клиента Javascript.Кажется, он воспринимает это как ответ и игнорирует реальный ответ.Как мне остановить XHR от принятия ответа OPTIONS?

Вот моя функция:

function makeRequest(method, url, data) {
  document.body.style.cursor = "wait";
  return new Promise (function (resolve, reject) {
    let xhr = new XMLHttpRequest();
    xhr.open(method, url)
    xhr.onload = function () {
      if (this.status == 200) {
        authToken = this.getResponseHeader('Authorization');
        document.body.style.cursor = "initial";
        console.log('responseText');
        console.log(this.responseText);
        resolve(JSON.parse(this.responseText));
      } else if (this.status == 403) {
        logout();
        document.body.style.cursor = "initial";
        reject({
                    status: this.status,
                    statusText: xhr.statusText
                });
      } else {
        document.body.innerHTML = 'Error: ' + this.responseText;
        document.body.style.cursor = "initial";
        reject({
                    status: this.status,
                    statusText: xhr.statusText
                });
      }
    };
    xhr.onerror = function () {
            document.body.innerHTML = 'Error: ' + this.responseText;
            document.body.style.cursor = "initial";
            reject({
                status: this.status,
                statusText: xhr.statusText
            });
        };
        xhr.setRequestHeader("Content-Type", "application/json");
        xhr.setRequestHeader("Authorization", authToken);
        xhr.send(data);
  });
} 

Это работает, но я не могу использовать его, так как мое приложение должно иметь возможность ожидатьответ от функции, прежде чем перейти к следующему:

function retrieveCategories(active) {
  document.body.style.cursor = "wait";
  var data = JSON.stringify({
  "active": active
});
console.log(data);

var xhr = new XMLHttpRequest();
xhr.withCredentials = true;

xhr.addEventListener("readystatechange", function () {
  if (this.readyState === 4 && this.status == 403) {
    logout();
    document.body.style.cursor = "initial";
  } else if (this.readyState === 4 && this.status != 200) {
    document.body.innerHTML = 'Error: ' + this.responseText;
    document.body.style.cursor = "initial";
  } else if (this.readyState === 4 && this.status == 200) {
    authToken = this.getResponseHeader('Authorization');
    categories = JSON.parse(this.responseText);
    document.body.style.cursor = "initial";
  }
});

xhr.open("POST", "http://127.0.0.1:7071/retrievecategories");
xhr.setRequestHeader("Content-Type", "application/json");
xhr.setRequestHeader("Authorization", authToken);

xhr.send(data);
}

Идеи очень ценятся!

1 Ответ

0 голосов
/ 05 февраля 2019

@ Квентин был прав, XHR не отвечал на ответ ОПЦИИ, как я изначально думал.Сервер отправлял некорректный ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...