У меня проблема, когда мой фронт Angular возвращает "неопределенный объект ответа" с моего сервера Node.
Для начала пользователь делает запрос GET для имени ресторана, сервер возвращает массив возможных имен. При щелчке по имени и уникальный идентификатор используется для создания другого запроса GET для получения дополнительной информации с сервера. Это первый случай, когда второй запрос GET делается там, где возникает проблема.
Объект ответа определен и выглядит отлично (как я его проиндексировал на каждом шагу) до тех пор, пока не вернется к функции 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 не определен, но тогда все в порядке на следующий запрос/ответ? Благодарю!
EDIT (для включения регистрации 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, который является моей домашней страницей, а другой - маршрутом в Angular. Вот журнал:
На вкладке "Ответ" просто сказано "не удалось загрузить ответ".
error.config: Object {method: "GET", transformRequest: Array [1], transformResponse: Array [1], url: "/api/location/10835756", headers: 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');
})
}
Если ответ с вашего сервера - это то, откуда вы не определились, вам нужно отправить точный ответ, полученный Хром, когда произойдет ошибка, чтобы мы могли видеть, что там происходит.
В инструментах Chrome Chrome инструменты XHR регистрируются, и когда вы видите неудавшийся запрос, разверните его, нажав на запись и снова под вкладкой сети.
Вы увидите точный разговор здесь, что браузер имел, убедитесь, что под вкладкой ответа, что ваш сервер не бросает ничего смешного. Также опубликуйте его для анализа.
return error
аreject(error)
в этомreturn error
вызове.catch(function(err){ console.log('Error in services: ', err, 'config(req): ', err.config); })
, то , что обработчик ошибок действительно возвращаетсяundefined
какое значение вы получаете дальше по цепочке.