Ответ от Node-сервера на Angular client не определен при первом (только) конкретном запросе

0

У меня проблема, когда мой фронт 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. Вот журнал:

Изображение 174551

На вкладке "Ответ" просто сказано "не удалось загрузить ответ".

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');
    })
  }
  • 0
    Говоря просто, вы не должны return error а reject(error) в этом return error вызове
  • 0
    Когда ошибка регистрируются в .catch(function(err){ console.log('Error in services: ', err, 'config(req): ', err.config); }) , то , что обработчик ошибок действительно возвращается undefined какое значение вы получаете дальше по цепочке.
Теги:
asynchronous
promise

1 ответ

0

Если ответ с вашего сервера - это то, откуда вы не определились, вам нужно отправить точный ответ, полученный Хром, когда произойдет ошибка, чтобы мы могли видеть, что там происходит.

В инструментах Chrome Chrome инструменты XHR регистрируются, и когда вы видите неудавшийся запрос, разверните его, нажав на запись и снова под вкладкой сети.

Вы увидите точный разговор здесь, что браузер имел, убедитесь, что под вкладкой ответа, что ваш сервер не бросает ничего смешного. Также опубликуйте его для анализа.

Изображение 174551

  • 0
    Я думаю, что я добавил все, что вы упомянули (и теперь у меня есть XHR logger в моем наборе инструментов, спасибо вам за это). Я не уверен, почему эта ошибка приводит к загрузке представления search.html. URL-адрес « localhost: 8080 / location # » после ошибки.
  • 0
    Спасибо за дополнительную информацию, не могли бы вы опубликовать содержимое вкладки Ответ или щелкнуть источник рядом со заголовком ответа.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню