XMLHttpRequest: реализация проблемы с перехватчиками - PullRequest
1 голос
/ 07 ноября 2019

Я пытаюсь реализовать перехватчик, следуя этому примеру , чтобы иметь возможность добавить заголовок аутентификации перед отправкой http-запроса с помощью monkey patching XMLHttpRequest#open function.

Мой код показан ниже (storage - это просто служба, которая содержит токен доступа):

// auth-interceptor.js
module.exports = ({ storage }) => {
  const oldXHROpen = XMLHttpRequest.prototype.open;

  XMLHttpRequest.prototype.open = () => {
    const res = oldXHROpen.apply(this, arguments);

    const accessToken = storage.get();

    if (accessToken) {
      this.setRequestHeader('Authentication', accessToken);
    }

    return res;
  };
};
// auth-interceptor.spec.js
describe('auth interceptor', () => {
  let fakeTokenStorage;

  beforeEach(() => {
    fakeTokenStorage = { get: () => 'xxxx-access-token-xxxx' };
    authInterceptor({ storage: fakeTokenStorage });
  });

  it('should include authentication header', () => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', 'http://base_url/api/check');
    // check if header exists
  });
});

Но когда вызывается .open(), я получаю следующую ошибку:

InvalidStateError: Объект находится в недопустимом состоянии.

  3 |
  4 |   XMLHttpRequest.prototype.open = () => {
> 5 |     const res = oldXHROpen.apply(this, arguments);
    |                            ^
  6 |
  7 |     const accessToken = storage.get();
  8 |

Кажется, что вызов oldXHROpen.apply(this, arguments) идет неправильно ... любойидеи?

1 Ответ

1 голос
/ 07 ноября 2019

Понял.

Заменено:

XMLHttpRequest.prototype.open = () => { }

Для:

XMLHttpRequest.prototype.open = function() { }

Для получения дополнительной информации: Почему функции со стрелками не имеют массива arguments?

...