У меня есть веб-приложение, созданное предыдущей компанией, написанное на Angular.JS.
Приложение предоставляет запрос на сервер (написанный на Node.JS + Express), чтобы собрать некоторые данные, необходимые для заполнения таблицы.
В частности, это запрос, который приложение отправляет каждый раз, когда пользователь входит на страницу, содержащую таблицу (переменная config содержит маркер доступа).
define(['app'], function (app) {
app.factory('AdvService', AdvService);
AdvService.$inject = ['BasicService'];
function AdvService(BasicService) {
var service = angular.extend(BasicService, {});
var $http = service.$http;
var API = service.API
var handleSuccess = service.handleSuccess;
var handleError = service.handleError;
var config = {
params: {
'token': JSON.parse(window.sessionStorage.getItem('session')).token
}
};
service.searchByCriteria = function (criteria) {
debugger;
config.params.pageNumber = criteria.pageNumber;
config.params.pageSize = criteria.pageSize;
return $http.get(API + '/api/v2/admin/ads/getAdsByCriteria', config).then(handleSuccess, handleError);
};
service.createAd = function (ad) {
debugger;
return $http.post(API + '/api/v2/admin/ads/insertNewAd', ad, config).then(handleSuccess, handleError);
};
return service;
}
});
handleSuccess и handleError определены так
define(['app'], function (app) {
app.factory('BasicService', BasicService);
BasicService.$inject = ['CONF', '$http', '$window', '$q'];
function BasicService(CONF, $http, $window, $q) {
$http.defaults.headers.common['x-access-token'] = JSON.parse($window.sessionStorage.getItem('session')).token;
return {
$http: $http,
API: CONF.API_URL,
handleSuccess: function (res) {
debugger;
var deferred = $q.defer();
res.data.success ? deferred.resolve(res.data) : deferred.reject(res.data.message);
return res.data;
},
handleError: function (error) {
debugger;
return {
success: false,
message: error
};
}
}
}
})
, и это единственная точка приложения, которая вызывает эту службу
($scope.search = function () {
debugger;
AdvService.searchByCriteria($scope.searchCriteria).then(function (res) {
debugger;
$scope.searchRes = res.data.docs;
//$scope.gridOptions.totalItems = res.data.total;
}, function (err) {
console.log(err);
});
})();
.запрос CORS (внешний порт находится на порте 8010, а другой - на другом), я вижу из системы сетевого мониторинга Chrome, что часть $ http.get выполняется дважды, но вот моя проблема: даже до начала обработкипри выполнении первого вызова, внешний интерфейс генерирует ошибку
angular.js:14961 TypeError: Cannot read property 'data' of undefined
at Object.<anonymous> (ui-grid.js:3291)
at Object.invoke (angular.js:5117)
at $controllerInit (angular.js:11139)
at nodeLinkFn (angular.js:10002)
at angular.js:10410
at processQueue (angular.js:17330)
at angular.js:17378
at Scope.$digest (angular.js:18515)
at Scope.scopePrototype.$digest (hint.js:1495)
at Scope.$apply (angular.js:18903)
, и даже если запрос возвращает данные после сбоя, Angular не может правильно отрендерить все.
Единственное, что я попробовал, - это использовать механизм Await / Async, чтобы попытаться подождать и посмотреть, что могло произойти, но это всегда разрешается в приведенной выше ошибке.
Кто-нибудь знает, что происходит?Я на 100% уверен, что код, который я выложил здесь, является единственным, который вызывается во время этого процесса, и я не могу честно понять, почему процесс должен завершиться неудачей, если оба запроса возвращают данные