26

How to handle etimedout error on this call ?

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

There are a way to wait for longer? or to request the remote file again?

What exactly can cause this error? Timeout only?

abatishchev
  • 98,240
  • 88
  • 296
  • 433
mcbjam
  • 7,344
  • 10
  • 32
  • 40

5 Answers5

47

This is caused when your request response is not received in given time(by timeout request module option).

Basically to catch that error first, you need to register a handler on error, so the unhandled error won't be thrown anymore: out.on('error', function (err) { /* handle errors here */ }). Some more explanation here.

In the handler you can check if the error is ETIMEDOUT and apply your own logic: if (err.message.code === 'ETIMEDOUT') { /* apply logic */ }.

If you want to request for the file again, I suggest using node-retry or node-backoff modules. It makes things much simpler.

If you want to wait longer, you can set timeout option of request yourself. You can set it to 0 for no timeout.

Andy Pan
  • 70
  • 2
  • 7
Farid Nouri Neshat
  • 29,438
  • 6
  • 74
  • 115
  • 1
    I believe these node core errors have a `.code` or similar property that contains just 'etimedout' or similar that you can check instead of having to do a `err.message.match()`. – mscdex May 13 '14 at 14:37
  • Hi. THanks for your help. Can you give me some link for better understanding error handling and catch in nodejs ? I have an etimdout after few seconds. – mcbjam May 13 '14 at 17:25
  • Can you please tell me this error is caused by a timeout, or it can be fired with another error ? – mcbjam May 13 '14 at 17:37
  • 1
    @mcbjam Updated it. It is fired by a timeout. No other error might. Although ESOCKETTIMEOUT might also be fired too, when your socket is freezed. Generally they don't fire together. – Farid Nouri Neshat May 14 '14 at 05:03
6

We could look at error object for a property code that mentions the possible system error and in cases of ETIMEDOUT where a network call fails, act accordingly.

if (err.code === 'ETIMEDOUT') {
    console.log('My dish error: ', util.inspect(err, { showHidden: true, depth: 2 }));
}
Priya Ranjan Singh
  • 1,567
  • 1
  • 15
  • 29
Lane
  • 4,682
  • 1
  • 36
  • 20
5

In case if you are using node js, then this could be the possible solution

const express = require("express");
const app = express();
const server = app.listen(8080);
server.keepAliveTimeout = 61 * 1000;

https://medium.com/hk01-tech/running-eks-in-production-for-2-years-the-kubernetes-journey-at-hk01-68130e603d76

Ashish Yadav
  • 350
  • 3
  • 17
0

Try switching internet networks and test again your code. I got this error and the only solution was switching to another internet.

Edit: I now know people besides me that have had this error and the solution was communicating with the ISP and ask them to chek the dns configuration because the http request were failing. So switching networks definitely could help with this.

That is why I will not delete the post. I could save people a few days of headaches (especially noobs like me).

Zeus
  • 21
  • 1
-2

Simply use a different network. Using a different network solved this issue for me within seconds. Probably because this other network had a stronger connection.