【问题标题】:Catching ECONNRESET error from spawned Node process从生成的节点进程中捕获 ECONNRESET 错误
【发布时间】:2015-10-19 19:03:30
【问题描述】:

我正在使用sftps NPM 使用用户名/密码身份验证连接到 SFTP 服务器并上传文件。成功时效果很好;但是,如果提供了无效的身份验证信息,几分钟后它会发出 ECONNRESET 错误,导致我的整个应用程序崩溃。

查看 sftps 模块的源代码,它似乎使用 child_process.spawn 来运行 shell 命令,并且看起来它应该优雅地捕获任何错误:

var sftp = spawn(shellCmd, shellOpts);

var data = "";
var error = "";

sftp.stdout.on('data', function (res) {
    data += res;
});

sftp.stderr.on('data', function (res) {
    error += res;
});

function finished(err) {
    error = error.split('\n').filter(function(line) {
        if (/^Connected to /.test(line)) return false;
        return true;
    }).join('\n');
    data = data.split('\n').filter(function(line) {
        if (/^sftp> /.test(line)) return false;
        return true;
    }).join('\n');
    if (callback) {
        if (err) {
            callback(err, { error: error || null, data: data });
        } else if (error) {
            callback(null, { error: error, data: data });
        } else {
            callback(null, { error: null, data: data });
        }
        callback = null;
    }
}

sftp.on('error', finished);

sftp.on('exit', function (code) {
    if (code === 0) {
        finished();
    } else {
        finished('Nonzero exit code: ' + code);
    }
});
sftp.stdin.write(cmdString, 'utf8');

看起来它已经挂接到stderr 流以及捕获子进程上的errorexit 事件。

我还能做些什么来捕获这个ECONNRESET 错误并在不终止应用程序的情况下记录它?

【问题讨论】:

    标签: node.js error-handling child-process spawn econnreset


    【解决方案1】:

    不知道您是否遇到与我相同的问题,但我最终通过将事件附加到 stdin.on("error") 来解决它。你可以试试这个看看是不是问题:

    sftp.stdin.on("error", function (e)
    {
        console.log("STDIN ON ERROR");
        console.log(e);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-01
      • 2017-11-08
      • 1970-01-01
      • 2019-01-17
      • 2013-06-01
      相关资源
      最近更新 更多