【问题标题】:How to handle ETIMEDOUT error?如何处理 ETIMEDOUT 错误?
【发布时间】:2023-03-28 00:09:01
【问题描述】:

如何处理此调用的 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);
        })

有没有办法等待更长的时间?还是再次请求远程文件?

究竟是什么导致了这个错误?仅超时?

【问题讨论】:

    标签: javascript node.js http error-handling timeout


    【解决方案1】:

    这是在给定时间内未收到您的请求响应时引起的(通过timeout 请求模块选项)。

    基本上要先捕获该错误,您需要在error 上注册一个处理程序,因此不会再抛出未处理的错误:out.on('error', function (err) { /* handle errors here */ })。更多解释here

    在处理程序中,您可以检查错误是否为 ETIMEDOUT 并应用您自己的逻辑:if (err.message.code === 'ETIMEDOUT') { /* apply logic */ }

    如果您想再次请求该文件,我建议使用node-retrynode-backoff 模块。它使事情变得更简单。

    如果你想等待更长时间,你可以设置timeout option of request yourself。您可以将其设置为 0 以表示不超时。

    【讨论】:

    • 我相信这些节点核心错误有一个 .code 或类似的属性,其中只包含 'etimedout' 或类似的属性,您可以检查而不必执行 err.message.match()
    • 我相信他们会这样做,我已经看到了。但不记得是哪个属性
    • 嗨。谢谢你的帮助。你能给我一些链接以更好地理解 nodejs 中的错误处理和捕获吗?几秒钟后我有一个 etimdout。
    • 你能告诉我这个错误是由超时引起的,还是可以被另一个错误触发?
    • @mcbjam 更新了它。它被超时触发。没有其他错误可能。虽然 ESOCKETTIMEOUT 也可能会被触发,但当您的套接字被冻结时。通常它们不会同时开火。
    【解决方案2】:

    我们可以查看属性code 的错误对象,该属性提到可能的系统错误,如果ETIMEDOUT 网络调用失败,请采取相应措施。

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

    【讨论】:

    • 最好是添加一些注释而不是随便乱扔代码。
    • 我还必须使用err.code 来获取“ETIMEDOUT”错误代码。最高票的答案err.message.code 对我不起作用。所以谢谢你:)
    • 可以试试这个keepAliveTimeout,详情请看下文
    【解决方案3】:

    如果您使用的是 node js,那么这可能是可能的解决方案

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-06-01
      • 2013-02-04
      • 2017-01-24
      • 2019-04-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多