2014-05-13 25 views
14

Jak radzić sobie z błędem etimedout podczas tej rozmowy?Jak radzić sobie z błędem ETIMEDOUT?

var remotePath = "myremoteurltocopy" 
var localStream = fs.createWriteStream("myfil");; 
     var out = request({ uri: remotePath }); 
     out.on('response', function (resp) { 
      if (resp.statusCode === 200) { 
       out.pipe(localStream); 
       localStream.on('close', function() { 
        copyconcurenceacces--; 
        console.log('aftercopy'); 
        callback(null, localFile); 
       }); 
      } 
      else 
       callback(new Error("No file found at given url."), null); 
     }) 

Jest na co czekać dłużej? lub ponownie zażądać zdalnego pliku?

Co dokładnie może spowodować ten błąd? Tylko limit czasu?

Odpowiedz

21

Jest to spowodowane, gdy odpowiedź na żądanie nie zostanie odebrana w danym czasie (przez opcję modułu żądania żądania timeout).

Zasadniczo, aby wykryć ten błąd jako pierwszy, musisz zarejestrować program obsługi na stronie error, aby nieobsługiwany błąd nie był już generowany: out.on('error', function (err) { /* handle errors here */ }). Jeszcze jedno wyjaśnienie: here.

W programie obsługi można sprawdzić, czy błąd jest ETIMEDOUT i zastosować własną logikę: if (err.message.code === 'ETIMEDOUT') { /* apply logic */ }.

Jeśli chcesz ponownie poprosić o plik, sugeruję użycie modułów node-retry lub node-backoff. To znacznie upraszcza sprawę.

Jeśli chcesz poczekać dłużej, możesz ustawić timeout option of request yourself. Możesz ustawić go na 0, bez limitu czasu.

+1

Wierzę, że te błędy rdzenia węzła mają właściwość '.code' lub podobną właściwość, która zawiera tylko" etimedout "lub podobne, które można sprawdzić, zamiast wykonywać' err.message.match() '. – mscdex

+0

Jestem pewien, że tak, widziałem to. Ale nie pamiętam, która własność. –

+0

Cześć. Dzięki za pomoc. Czy możesz podać mi link do lepszego zrozumienia błędów i złapania nodejów? Mam etimdout po kilku sekundach. – mcbjam

0

Moglibyśmy spojrzeć na obiekt błędu dla właściwości code, która wspomina o możliwym błędzie systemowym, aw przypadku ETIMEDOUT, w przypadku niepowodzenia połączenia sieciowego, podejmij odpowiednie działania.

if (err.code === 'ETIMEDOUT') { 
    console.log('My dish error: ', util.inspect(err, { showHidden: true, depth: 2 })); 
} 
+1

Najlepiej, jeśli dodasz komentarz, a nie tylko podrzucisz kod. –

Powiązane problemy