0

sftps NPM を使用して、ユーザー名/パスワード認証を使用して SFTP サーバーに接続し、ファイルをアップロードしています。これは、成功すると美しく機能します。ただし、無効な認証情報が提供された場合、数分後にECONNRESETエラーが発生し、アプリケーション全体がクラッシュします。

sftps モジュールのソースを見るとchild_process.spawn、シェル コマンドを実行するために使用されているようで、エラーを適切にキャプチャする必要があるようです。

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このエラーをキャプチャして、アプリケーションを強制終了せずにログに記録するには、他に何ができますか?

4

1 に答える 1

2

私が抱えていたのと同じ問題を抱えているかどうかはわかりませんが、イベントを に添付することで最終的に解決しましたstdin.on("error")。これを試して、それが問題かどうかを確認できます。

sftp.stdin.on("error", function (e)
{
    console.log("STDIN ON ERROR");
    console.log(e);
});
于 2016-05-18T02:08:44.910 に答える