2015-01-24 3 views
0

Итак, я использую yo-угловой сгенерированный узел/угловое приложение.Узел/Угловой не загружается, когда вызовы API приложения не подключаются.

При запуске приложения локально все работает так, как ожидается, пока мое приложение не попытается асинхронно загружать вызовы API из внешней конечной точки API через мой прокси-маршрут в экспресс. Если эти вызовы API отклоняются (возможно, если конечная точка не указана или конечная точка не существует), общее приложение перестает загружать его содержимое.

Что вам нужно, чтобы начать выявлять эту проблему?

Вот мой прокси-код, API вызовы передаются через:

exports.request = function(req, res) { 
    var url = req.params[0]; 
    var _url = req.url; 

    var options = { 
     host : 'api.appserver.site.com', 
     port : '8080', 
     path : req.url, 
     method : req.method, 
     headers : { 
      'Content-Type': 'application/vnd.rhcm.app-v1.0' 
     } 
    }; 

    var api_request = http.request(options, function(api_response) 
    { 
     var api_data = ""; 
     api_response.on('error', function(e) { 
      res.status(500).send('Unable to connect to the web service.'); 
     }); 
     api_response.on('data', function(chunk) { 
      api_data += chunk; 
     }); 
     api_response.on('end', function() { 
      try { 
       var parsedResponse = JSON.parse(api_data); 
       res.json(parsedResponse); 
      } catch (e) { 
       res.status(500).send('Proxied result returned bad data.'); 
      } 
     }); 
    }); 
    api_request.end(); 
}; 

И когда API не может быть достигнуто, я получаю эту ошибку:

events.js:72 
     throw er; // Unhandled 'error' event 
      ^
Error: getaddrinfo ENOTFOUND 

и, если достаточно плохие звонки сделаны для этого запрещенного API, все приложение перестанет обслуживаться.

Однако страница может загружать просто отлично, если удалить следующую часть этого блока кода: ->

var api_request = http.request(options, function(api_response) 
{ 
    ... 
}); 
api_request.end(); 

Edit: Я только что нашел этот комментарий нить на репо nodejs по поводу возможной памяти проблемы с наращиванием/сбоем, когда происходит слишком много соединений. Это может быть та же проблема. https://github.com/joyent/node/issues/5545

Итак, что я могу сделать, чтобы гарантировать, что независимо от того, сколько запросов API отклонено, само приложение может по-прежнему загружаться?

ответ

1

Вы можете слушать на HTTP события, чтобы поймать ошибки DNS:

api_request.on('error', function(err, ... 
api_request.end() 

еще лучше, попробуйте модуль запроса (https://github.com/request/request), который будет обрабатывать эти и многие другие вопросы для вас.

+0

'api_request не имеет метода 'on'' - есть документация где-то, что показывает, что я могу поймать ошибки таким образом? Кроме того, можете ли вы объяснить, как я могу передать метод http на следующий запрос, если я должен использовать модуль запроса? – Kristian

+0

Мне пришлось перестроить код, отделить мою функцию 'http.request (...)' callback и использовать его вместо этого в качестве обратного вызова в 'api_request.on ('connect', function() {})'. Как только я это сделал, я мог бы написать 'api_request.on ('error', function (error) {...})' – Kristian

Смежные вопросы