我的程序中定义了两个异步函数;其中一个ping一个给定的IP地址(使用net-ping模块)并且'返回' (通过回调)ping是否成功,另一个创建到给定IP地址的SSH连接(使用ssh2模块)并且还返回'连接是否成功。
当我尝试使用data.txt
功能从readline
文件读取IP数据时出现问题。我使用readline
模块从文件读取每一行,使用回调以阻塞方式调用ping和ssh,然后将这些返回值放入一个数组中以便稍后使用。我已经能够验证函数是按照我期望的顺序执行的,并且返回值是真正返回的。但是,当程序到达文件的末尾 - 而不是终止时,它只是读取再次提交文件,再次提交。
SSH功能定义为:
function SSH(ipAdress, callback) {
connection.on('ready', function(err) {
if(err) {
throw err;
returnValue = "ErrorWithReadyConnection";
callback(null, returnValue);
}
//runs the uptime command once we have SSH'd into the machine
connection.exec('uptime', function(err, stream) {
if(err) {
throw err;
returnValue = "ErrorRunningCommandFromSSH";
callback(null, returnValue);
}
else {
stream.on('close', function(code, signal) {
//code holds the response from running 'uptime'
console.log("Stream on close. Code : " + code +
". Signal: " + signal);
connection.end();
returnValue = "success";
callback(null, returnValue);
}).on('data', function(data) {
console.log("STDOUT: " + data);
}).stderr.on('data', function(data) {
console.log("STDERR: " + data);
});
}
});
//Parameters for the SSH connection
}).connect({
host: ip,
port: 22,
username: userName,
privateKey: privateKey,
passphrase: passPhrase
}); //connect
//handle any connection errors done whilst creating a connection
connection.on('error', function(err) {
if(err) {
returnString = "ErrorWaitingForHandshake";
callback(null, returnString);
}
}); //end connect
}
ping函数定义为:
function pingFunc(ip, callback) {
var returnString;
//Create a ping session, passing the IP of the machine to ping
sessions.pingHost(ip, function(error, target) {
//if error, then examine what type of error has occured
if(error) {
if(error instanceof ping.RequestTimedOutError) {
returnString = "RequestTimedOut";
}
//else, different error - output the error string.
else {
returnString = "Error";
}
} //End error handling
//else, ping was successful
else {
returnString = "Alive";
}
callback(null, returnString);
});
//return returnString;
}
我调用函数的代码是:
var allMachines = new Array();
var lineReader = require('readline').createInterface({
input: require('fs').createReadStream('data.txt');
});
lineReader.on('line', function(line) {
pingFunc(line, function(err, pingResult) {
SSH(line, function(err, sshResult) {
var machineTemp = [{'ping': pingResult, 'ssh': sshResult }];
allMachines = allMachines.concat(machineTemp);
})
})
}
我计划稍后使用allMachines
数组创建一个JSON文件,但是这个无限循环正在停止所有可能的进展。我试图在SSH函数中移动connection.on('error', ...)
,我认为这会导致无限循环,但事实证明这是徒劳的。
非常感谢任何帮助 - 谢谢!
P.S如果有人知道在readlines
完成后我将如何注册,并且allMachines
数组已经填充了必要的数据,我也将非常感激!我尝试使用readline.on('close', ...)
,但是在SSH和ping完成执行之前调用它,所以对我没用!再次感谢