在Node js中进行SSH连接时,为什么在建立SSH连接之前执行后一个代码



我写了以下代码:

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对象都会收到正确的消息,然后您可以将它们记录到控制台。

最新更新