我正在使用ssh2 nodejs模块连接到UNIX应用程序并运行脚本并且成功。 现在我想逐个连接到多个服务器并获取输出并存储它。 当我尝试使用for循环从json一个接一个地传递服务器作为ssh2的输入时,for循环的完成速度比应该从服务器获取输出的块快得多。 这也导致我握手错误。 请帮助
这是代码
inc_cron.schedule("*/20 * * * * *", function(id) {
});
//inc_cron.js
var cronFunction = function(inputStr) {
if(appNames['applications'].length>0){
for (i = 0; i < appNames["applications"].length; i++) {
getDataFromServer(appNames["applications"][i].Name,appNames["applications"][i].hostname, appNames["applications"][i].username, appNames["applications"][i].password, appNames["applications"][i].log_path, function(err, data) {
if(err) {
logger.info("Error is in cronFunction = ", err);
} else if(data) {
output_data +=data;
} ssh.close_second();
});
}
}
}
var getDataFromServer = function(Name,hostname, username, password, log_path, cb) {
ssh.close_second();
ssh.connect_second({
host: hostname,
username: username,
password: password
}, function(err) {
if(err) {
logger.error('Err: ', err);
} else {
ssh.sftp("",'grep -o "ERROR" '+log_path+'.log.'+yr+'-'+mnth+'-* | wc -l', function(err, data) {
cb(err, data);
}); } }); }
//connect.js
SSHConnection.prototype.sftp = function(type, path, cb) {
var self = this;
var log_data = '';
self.connection2.exec(path +' ' + type, { pty: true }, function(err, stream) {
if (err) {
logger.log('SECOND :: exec error: ' + err);
}
stream.on('end', function() {
self.connection2.end(); // close parent (and this) connection
}).on('data', function(data) {
logger.info(data.toString());
});
});
};
答案 0 :(得分:0)
如果不注意代码,请务必正确处理ssh2的异步问题...使用承诺工厂。
答案 1 :(得分:0)
执行此操作的一种方法是使用es7 async await。为此,您必须重写getDataFromServer函数以返回promise:
var getDataFromServer = function(Name,hostname, username, password, log_path, cb) {
return new Promise(function(resolve,reject){
ssh.close_second();
sh.connect_second({
host: hostname,
username: username,
password: password
},function(err) {
if(err){
reject(err)
}else{
ssh.sftp("",'grep -o "ERROR" '+log_path+'.log.'+yr+'-'+mnth+'-* | wc -l', function(err, data) {
if(err){
reject(err)
}else{
resolve(data)
}
})
}
})
})
}
现在您可以将您的cron函数重写为异步函数。
var cronFunction = async function(inputStr) {
if(appNames['applications'].length>0){
for (i = 0; i < appNames["applications"].length; i++) {
try{
output_data + = await getDataFromServer(appNames["applications"][i].Name,appNames["applications"][i].hostname, appNames["applications"][i].username, appNames["applications"][i].password, appNames["applications"][i].log_path)
}catch(err){
logger.info("Error is in cronFunction = ", err);
}
ssh.close_second();
}
}
}
async await使您能够以同步编码样式编写异步代码。
但是异步等待当前(节点7. *)隐藏在标志(--harmony-async-await
)后面。默认情况下,此功能将于2017年4月在upcomming node release(8.0.0)中启用。
所以要启动你的应用程序,你现在必须使用
node --harmony-async-await yourapp.js
P.S。:此代码目前尚未经过测试,很可能包含错误..但您明白了。