Ошибка типа при использовании 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, вызывающее проблемы.