我使用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
流,并捕获子流程上的error
和exit
事件。
我还能做些什么来捕获此ECONNRESET
错误并记录它而不会终止应用程序?
答案 0 :(得分:2)
不知道你是否遇到了我遇到的同样问题,但我最终通过将事件附加到sftp.stdin.on("error", function (e)
{
console.log("STDIN ON ERROR");
console.log(e);
});
来解决了这个问题。您可以尝试这个来查看是否存在问题:
CLPlacemark