[在节点js中建立ssh连接时,为什么在建立ssh连接之前执行后面的代码

问题描述 投票:0回答:1

我编写了以下代码:

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,因此在我运行此代码后,它也会输入并执行该代码,期望它会console.log info具有更新的值,但我首先得到的是未更新的info,然后执行上述代码。谁能帮助我了解为什么会这样以及如何解决此问题?

javascript node.js asynchronous ssh synchronous
1个回答
0
投票

尽管console.log(info);位于程序的底部,但是它将在其他async方法执行之前被执行,因此,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对象都会收到正确的消息,然后可以将其记录到控制台。

© www.soinside.com 2019 - 2024. All rights reserved.