0

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

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

TypeError: Cannot read property 'isProtoTypeOf' of undefined at eval [filepath]aurelia-fetch-client.

Фактическая ошибка бросаются в файл Aurelia-Fetch-клиенте на линии 134. код есть:

Этот код от Aurelia-Fetch-клиент:

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); 
    }); 
    }); 

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

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

documentation заявляет, что мне нужно загрузить полипол для этого, поэтому я загружаю полифонию «выборки», как указано (я делаю это в 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. Создается новая область, в которой будет жить новый набор экранов, что также может позволить красивую инкапсуляцию файлов и зависимостей, но использовать существующий уровень сервиса, который предоставляет интерфейсы данных.

+0

Таким образом, проблема, с которой вы столкнулись, заключается в том, что класс 'Request' не определен. Как вы сказали, способ решить это через полипол. Трудно сказать, что еще может исправить.Я бы проверял, что полипол заполняется, проверяет, что 'Request' получает определение в глобальном пространстве имен (через точки останова) и дважды проверяет, что вышеуказанный код случайно не вызван, прежде чем загружать полипол. –

+0

@matthewjames Фактически это объект Response в коде Aurelia-Fetch-Client. Я проверил, загружен ли fetch.js. Я действительно импортировал его в файл main.js. Я попытался загрузить его в класс, который имеет фактические вызовы HTTP, но получить ту же проблему. Есть ли дополнительный вызов метода, который мне нужно сделать, чтобы загрузить его? – Catchops

ответ

0

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

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

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

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