2014-04-12 7 views
5

Использование простого request.js http client Я заметил, что иногда простой TypeError может привести к сбою всего приложения узла. Взяв один из примеров:Предотвращение сбоя приложения Node TypeError

request('http://www.google.com', function (error, response, body) { 
    if (!error && response.statusCode == 200) { 
     console.log(body) // Print the google web page. 
    } 
}) 

Теперь возьмите гипотетическую ситуацию, когда Google не отвечает, а соединение просто зависает, то тайм-аут (в случае, если от Google!). Этот код просто сбрасывает приложение узла, так как response не определено, поэтому response.statusCode не может быть прочитан. Это пузырится в цикл обработки событий и вызывает сбой с ошибкой:

TypeError: Cannot read property 'statusCode' of undefined 

Что это самый простой способ я могу предотвратить это? Я мог бы добавить проверку для значения error перед проверкой для statusCode, например:

request('http://www.google.com', function (error, response, body) { 
    if (!error) { 
     if (response.statusCode == 200) { 
      // do stuff 
     } 
    } 
}) 

Но я предпочел бы не добавлять ненужные строки в приложение, если это возможно. Мне может быть что-то очевидное здесь! Любые указатели очень оценили. Благодарю.

ответ

4

Короткий ответ: Это то, что вы получаете. Многословный Ответ:

  • Всегда проверять на наличие ошибок
  • Всегда проверяйте ваши данные

Так, что-то вроде этого является довольно OK:

if (!error && body) { 
    //do whatever you want with your body 
} 

if (!error && response) { 
    //do whatever you want with response 
} 

Вы должны убедиться, что объект существует прежде чем пытаться получить к нему доступ (в тех случаях, когда существование объекта не гарантируется). Также обратите внимание на модуль maybe2. С помощью этого модуля вы можете написать somethis так:

if (!error && maybe(response).getOrElse({}).statusCode == 200) { 
    //your code here 
} 
  • использовать Node.js режим кластера, модули супервизора как forever и/или балансировки нагрузки прокси как Nginx в передней части вашего приложения. Таким образом, если один запрос не будет выполнен, другие запросы будут выполнены другими экземплярами вашего приложения.
  • Будьте готовы обрабатывать ошибки на стороне клиента и повторять запросы при сбое.
Смежные вопросы