2014-05-13 9 views
14

Come gestire l'errore etimedout su questa chiamata?Come gestire l'errore 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); 
     }) 

C'è un modo di attendere più a lungo? o per richiedere nuovamente il file remoto?

Che cosa può causare esattamente questo errore? Solo timeout?

risposta

21

Ciò è causato quando la risposta della richiesta non viene ricevuta in un dato tempo (tramite l'opzione del modulo di richiesta timeout).

Fondamentalmente per rilevare prima questo errore, è necessario registrare un gestore su error, in modo che l'errore non gestito non venga più generato: out.on('error', function (err) { /* handle errors here */ }). Qualche altra spiegazione here.

Nel gestore è possibile verificare se l'errore è ETIMEDOUT e applicare la propria logica: if (err.message.code === 'ETIMEDOUT') { /* apply logic */ }.

Se si desidera richiedere nuovamente il file, suggerisco di utilizzare i moduli node-retry o node-backoff. Rende le cose molto più semplici.

Se si desidera attendere più a lungo, è possibile impostare timeout option of request yourself. È possibile impostarlo su 0 per nessun timeout.

+1

Credo che questi errori fondamentali nodo hanno una proprietà '.code' o simile che contiene solo 'ETIMEDOUT' o simile che è possibile controllare, invece di dover fare un' err.message.match() '. – mscdex

+0

Sono sicuro che lo facciano, l'ho visto. Ma non ricordo quale proprietà –

+0

Ciao. Grazie per l'aiuto. Puoi darmi qualche link per capire meglio la gestione degli errori e prendere in nodejs? Ho un etimdout dopo pochi secondi. – mcbjam

0

È possibile esaminare l'oggetto di errore per una proprietà code che menziona il possibile errore di sistema e nei casi di ETIMEDOUT in cui una chiamata di rete non riesce, agire di conseguenza.

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

È meglio se aggiungi qualche commento e non solo il codice del lancio. –