У меня возникла проблема, когда мой интерфейс Angular возвращает «неопределенный» объект ответа с моего сервера Node.
Для начала пользователь делает запрос GET на название ресторана, сервер возвращает массив возможных названий. При нажатии на имя и использовании уникального идентификатора для выполнения другого запроса GET для получения дополнительной информации с сервера. Это первый раз, когда второй запрос GET делается там, где возникает проблема.
Объект ответа определен и выглядит нормально (поскольку я записал его в console.log на каждом этапе пути), пока он не вернется к функции getLocationResults в services.js, где он внезапно становится неопределенным.
Итак, getLocationResults в services.js:
var getLocationResults = function(id){
return $http({
method: 'GET',
url: '/api/location/' + id
})
.catch(function(err){
console.log('Error in services: ', err, 'config(req): ', err.config);
//logs “Error in services: Object {data: null, status: -1, config:
//Object, statusText: ""} “
})
.then(function(resp){
console.log('Response in getLocationResults: ', resp)
//logs “Response in getLocationResults: undefined”
return resp.data;
})
};
отправляет запрос $http на сервер по этому маршруту:
router.get('/location/:id', function(req, res){
var results = Results.findByLocationId(req.params.id)
.then(function(response){
console.log('Response IN API: =========', response);
res.send(response);
})
});
к этой модели, которая запрашивает внешний API:
Results.findByLocationId = function(id){
var baseUrl = 'https://data.austintexas.gov/resource/nguv-n54k.json?
facility_id=' + id
var options = {
url: baseUrl,
'X-App-Token': appToken
};
return new Promise(function(resolve, reject){
request.get(options,
function(error, response, body){
if(error) {
console.log("Error!", error);
return error
} else {
response.body = JSON.parse(body);
console.log('LOCATION response-body-length: ', response.body.length)
resolve(response.body);
}
});
});
}
Ответ в порядке на стороне сервера, но каким-то образом теряется между get.(‘/location’, function(req, res){…}) в моих маршрутах и getLocationResults в services.js. Функция res.send(response) безотказно работает на других маршрутах, поэтому я предполагаю, что ее можно использовать здесь.
Одна из странных частей заключается в том, что после получения этой ошибки, если я попытаюсь сделать запрос для этого объекта_идентификатора или снова выполнить поиск другого, запрос будет выполнен так, как должен. Я понятия не имею, почему эта ошибка возникает только при первом запросе.
Вторая странная часть заключается в том, что модель на стороне сервера или маршрутизация для этого запроса ничем не отличаются от предыдущего запроса, который необходимо сначала выполнить для поиска результатов либо по почтовому индексу, либо по названию ресторана. Вот как выглядит getNameResults в моем файле сервисов:
var getNameResults = function(name){
return $http({
method: 'GET',
url: '/api/name/' + name
})
.catch(function(err){
console.log('Error in services: ', err)
})
.then(function(resp){
return resp.data
});
};
Любые идеи, почему мой первый ответ на getLocationResults не определен, но затем подходит для следующего запроса/ответа? Спасибо!
РЕДАКТИРОВАТЬ (для включения ведения журнала XHR):
Когда выполняется запрос GET, который приводит к ошибке, это регистрируется в консоли:
angular.js:11756
XHR failed loading: GET "http://localhost:8080/api/location/10835756".
v
(anonymous function) @ angular.js:11756
sendReq @ angular.js:11517
serverRequest @ angular.js:11227
processQueue @ angular.js:15961
(anonymous function) @ angular.js:15977
Scope.$eval @ angular.js:17229
Scope.$digest @ angular.js:17045
Scope.$apply @ angular.js:17337
(anonymous function) @ angular.js:25023
defaultHandlerWrapper @ angular.js:3456
eventHandler @ angular.js:3444
А затем в инструментах Chrome Dev на вкладке «Сеть» с выбранным XHR:
Единственный существующий запрос — это запрос к search.html, который является моей домашней страницей и маршрутом .otherwise в Angular. Вот журнал:
На вкладке «Ответ» просто написано «не удалось загрузить ответ».
error.config: Object {метод: «GET», transformRequest: Array[1], transformResponse: Array[1], url: «/api/location/10835756», заголовки: Object}
Возможно ли, что я неправильно использую $location.path в моем searchCtrl?
this.findByLocationId = function(id){
console.log('ResultsCtrl in findByLocationId: ', id)
$routeParams.id = id;
Search.getLocationResults(id)
.then(function(inspections){
console.log('Funky Cold Medina') // doesn't log
ResultService.inspections = inspections;
})
.then(function(){
$location.path('/location');
})
}