Ошибка типа при использовании aurelia-fetch-client

Я использую aurelia-fetch-client версии 1.0.1.

Я выполняю выборку в классе обслуживания, который я создал, и получаю сообщение об ошибке:

TypeError: Невозможно прочитать свойство isProtoTypeOf из неопределенного в eval [filepath]aurelia-fetch-client.

Фактическая ошибка выдается в файле aurelia-fetch-client в строке 134. там есть код:

Этот код от aurelia-fetch-client:

var promise = processRequest(request, this.interceptors).then(function (result) {
    var response = null;

    if (Response.prototype.isPrototypeOf(result)) {  <<--PROBLEM IS HERE!!!! LINE 134
      response = result;
    } else if (Request.prototype.isPrototypeOf(result)) {
      request = Promise.resolve(result);
      response = fetch(result);
    } else {
      throw new Error('An invalid result was returned by the interceptor chain. Expected a Request or Response instance, but got [' + result + ']');
    }

    return request.then(function (_request) {
      return processResponse(response, _this.interceptors, _request);
    });
  });

Смотри выше. Я прокомментировал строку кода, выдающую ошибку. "Прототип" является нулевым, поэтому он возвращает данное сообщение об ошибке.

У меня все это работало в предыдущем проекте, но с использованием бета-версии aurelia-fetch-client. Код ниже очень похож на код, вызывающий бета-версию aurelia-fetch-client.

В документации говорится, что для этого мне нужно загрузить polyfill, поэтому я загружаю polyfill "fetch", как указано (я делаю это в main.js), но все равно продолжаю получать эту ошибку. То же самое происходит, если я загружаю это здесь в сервисе.

Кто-нибудь сталкивался с этим, и как вы решили это?

Вот некоторый код вызова службы и базовой службы:

import {inject} from 'aurelia-framework';
import {Configure} from 'aurelia-configuration';
import {HttpClient} from 'aurelia-fetch-client';

export class ServiceBase {

    // *************************************************************
    // Services Constructor
    // Sets up the base http Client configuration
    // *************************************************************
    constructor(configure, httpClient) {

        // Set up configuration and initial user token
        this.userToken = 'tokenvalue';  //TODO: put real one in later,  not used on this call
        this.configure = configure;
        this.httpClient = httpClient;

        this.httpClient.configure(config => {
            config
              .withBaseUrl(this.configure.get('servicesBaseUrl'))
              .withDefaults({
                  headers: {
                      'content-Type': 'application/x-www-form-urlencoded',
                      'Accept': 'application/x-www-form-urlencoded',
                      'X-Requested-With': 'Fetch'
                  },
                  mode: 'cors'
              })
              .withInterceptor({
                  request(request) {
                      console.log('KCU Class Requesting: ' + request.method + '; ' + request.url);
                      return request;
                  },
                  response(response) {
                      console.log('KCU Class Received: ' + response.status + '; ' + response.url);

                      if (response.status !== 200) {
                          throw response;
                      } else {
                          return response;
                      }

                  },
                  requestError(err) {
                      console.log('Request Error Receieved: ' + err.toString());
                  }
              });
        });

    }

}

и сервис, который расширяет этот базовый класс:

import {inject} from 'aurelia-framework';
import {HttpClient, json} from 'aurelia-fetch-client';
import {Configure} from 'aurelia-configuration';
import {ServiceBase} from './serviceBase'

@inject(Configure, HttpClient)

export class HospitalService extends ServiceBase {

    constructor(configure, httpClient) {
        super(configure, httpClient);

        this.configure = configure;

    }

    // ****************************************
    // Extracts the list of hospitals for the initial search grid
    // ****************************************
    getHospitalListSearchGridData() {

        let urlCompletion = '';

        return this.httpClient.fetch(
            this.configure.get('HospitalSearch') + urlCompletion,    // This is the method name on the service to call
            {
                method: 'get',
                headers: {
                    'Authorization': 'Bearer ' + this.userToken.toString()
                }
            }            
            )
            .then(response => response.json())
            .then(responseInfo => {
                return responseInfo;
            })
            .catch(error => {
                return false;
            });

    }

}

Немного больше информации о проекте в целом, что он создается внутри существующего проекта ASP.NET MVC. Создается новая область, где будет жить новый набор экранов, который также может обеспечить хорошую инкапсуляцию файлов и зависимостей, но использовать существующий уровень обслуживания, который обеспечивает интерфейсы данных.

1 ответ

Решение

Для тех из вас, кто может столкнуться с этим (или с чем-то похожим), я нашел источник проблемы.

Это не имеет ничего общего с полифилом. Код JS работал в последней версии Chrome (v 54.xxx). И поскольку это был не старый браузер, полифилл не был виноват. Проблема была в столкновении файлов javascript.

Объект "Ответ" каким-то образом был переопределен, и я должен был определить, где. Поскольку он находится внутри более крупного приложения ASP.NET MVC, я просмотрел дерево приложений в файлах сценариев основного приложения и обнаружил, что действительно используется файл response.js. Он был реализован давно, чтобы помочь в доступе к уровню обслуживания нашего пакета приложений.

Когда это было удалено, aurelia-fetch-client работал как рекламируется. Проблема сейчас в том, что часть существующего кода, обращающегося к сервисам, не работает должным образом. Решение для этого выходит за рамки этой статьи. В итоге, это было столкновение JS, вызывающее проблемы.

Другие вопросы по тегам