web-dev-qa-db-fra.com

Comment gérer l'erreur ETIMEDOUT?

Comment gérer l'erreur etimedout sur cet appel?

 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);
        })

Il y a un moyen d'attendre plus longtemps? ou pour demander à nouveau le fichier distant?

Qu'est-ce qui peut provoquer exactement cette erreur? Délai d'expiration uniquement?

17
mcbjam

Cela se produit lorsque votre réponse à la demande n'est pas reçue dans un délai donné (par l'option de module de demande timeout).

Fondamentalement, pour détecter cette erreur en premier, vous devez enregistrer un gestionnaire sur error, afin que l'erreur non gérée ne soit plus levée: out.on('error', function (err) { /* handle errors here */ }). Quelques explications supplémentaires ici .

Dans le gestionnaire, vous pouvez vérifier si l'erreur est ETIMEDOUT et appliquer votre propre logique: if (err.message.code === 'ETIMEDOUT') { /* apply logic */ }.

Si vous souhaitez demander à nouveau le fichier, je suggère d'utiliser les modules node-retry ou node-backoff . Cela rend les choses beaucoup plus simples.

Si vous voulez attendre plus longtemps, vous pouvez définir timeout option de demande vous-même . Vous pouvez le régler sur 0 sans délai.

30

Nous pourrions regarder l'objet erreur pour une propriété code qui mentionne l'erreur système possible et dans les cas de ETIMEDOUT où un appel réseau échoue, agissez en conséquence.

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