2014-04-12 11 views
5

Korzystanie z prostego Zauważyłem, że czasami prosty TypeError może spowodować awarię całej aplikacji węzła. Biorąc jeden z przykładów:Zapobieganie awarii aplikacji Nero TypeError

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

Teraz weź hipotetyczna sytuacja, w której Google nie odpowiada, a następnie połączenie prostu zawiesza się czasy (w przypadku Google!). Ten kod po prostu powoduje awarię aplikacji węzła jako response jest niezdefiniowany, więc response.statusCode nie można odczytać. Pęka to do pętli zdarzeń i powoduje awarię z błędem:

TypeError: Cannot read property 'statusCode' of undefined 

Jaki jest najprostszy sposób, aby temu zapobiec? Mógłbym dodać czek o wartości error przed sprawdzeniem dla statusCode na przykład:

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

Ale wolałbym nie dodawać niepotrzebnych linii do aplikacji, jeśli to możliwe. Może brakuje tu czegoś oczywistego! Wszelkie wskazówki są bardzo cenne. Dzięki.

Odpowiedz

4

Krótka odpowiedź: oto, co otrzymujesz. odpowiedź gadatliwy:

  • Zawsze należy sprawdzić pod kątem błędów
  • Zawsze sprawdzić dane

Tak, coś w tym jest całkiem OK:

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

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

Musisz upewnić się, że obiekt istnieje przed próbą uzyskania dostępu (w przypadkach, gdy istnienie obiektu nie jest gwarantowane). Ponadto, spójrz na moduł maybe2. Z tego modułu można pisać somethis tak:

if (!error && maybe(response).getOrElse({}).statusCode == 200) { 
    //your code here 
} 
  • Użyj opcji node.js tryb klastra, moduły nadzorcy jak forever i/lub równoważenia obciążenia serwera proxy jak nginx przed aplikacją. W ten sposób, jeśli jedno żądanie nie powiedzie się, inne żądania zostaną spełnione przez inne instancje aplikacji.
  • Bądź przygotowany na obsługę błędów po stronie klienta i powtarzaj żądania w przypadku niepowodzenia.
Powiązane problemy