我写了以下代码:
var Client = require('ssh2').Client;
var info={
errors:'',
stdout:'',
stderr:''
};
conn=new Client();
conn.on('ready',()=>{
console.log('entering...');
conn.exec('ls',(err,stream)=>{
if(err) info.errors=err;
stream.on('close',(code,signal)=>{
console.log('leaving: code:'+code+' signal:'+signal);
});
stream.on('data',(data)=>{
info.stdout=data;
}).stderr.on('data',(data)=>{
info.stderr=data;
});
});
}).connect({
host: ip,
port: 22,
username: u,
password: p
});
//this gets printed earlier
console.log(info);
因此,在上面的代码中,连接到服务器并执行命令并使用已执行命令的输出更新对象info
,因此在我运行此代码后,它会输入并执行代码,预期是它将控制台.loginfo
使用更新的值,但我得到的是首先是未更新的info
,然后是上面的代码。 谁能帮助我了解为什么会发生这种情况以及如何解决这个问题?
虽然console.log(info);
位于程序的底部,但它将在执行其他异步方法之前执行,因此不会更新info
对象。
conn.on('ready',()=>{...
stream.on('data',(data)=>{...
都是异步函数,它们将在事件队列中排队,以便在解析后进行处理,并且队列空闲。
可以选择在每个异步方法的回调中使用console.log(info)
。
conn.on('ready',()=>{
console.log('entering...');
conn.exec('ls',(err,stream)=>{
if(err) {
info.errors=err;
console.log(info);
}
stream.on('close',(code,signal)=>{
console.log('leaving: code:'+code+' signal:'+signal);
});
stream.on('data',(data)=>{
info.stdout=data;
console.log(info);
}).stderr.on('data',(data)=>{
info.stderr=data;
console.log(info);
});
});
}).connect({
host: ip,
port: 22,
username: u,
password: p
});
这样,每当接收数据或发生错误时,info
对象都会收到正确的消息,然后您可以将它们记录到控制台。