如何从Nexpect方法获取变量?

问题描述:

我从Docker内部运行Nexpect,我需要获得另一个Docker容器的IP,因此我将ssh放入主机,然后使用Nexpect运行一个方法来获取IP地址,但我不知道为什么该方法是返回null,这里是方法的代码:如何从Nexpect方法获取变量?

exports.getIP = function(username){ 
    var nexpect = require('nexpect'); 
    var ip; 

    nexpect.spawn("ssh [email protected] docker inspect --format '{{ .NetworkSettings.IPAddress }}' " + username) 
     .expect(" ") 
     .run(function (err, stdout, exitcode) { 
      if (err || !err) { 
        console.log("stdout = " + stdout); 
      } 

      ip = stdout; 
    }); 

    console.log("ip = " + ip); 
    return ip; 
}; 

由于它是异步的,你返回值立刻当它尚未在nexpect方法中分配。你需要添加一个回调来告诉它何时返回结果。

exports.getIP = function(username, callback){ 
    var nexpect = require('nexpect'); 

    nexpect.spawn("ssh [email protected] docker inspect --format '{{ .NetworkSettings.IPAddress }}' " + username) 
     .expect(" ") 
     .run(function (err, stdout, exitcode) { 
      if (err) { 
       callback(err); 
      } 

      ip = stdout; 
      callback(null, ip); 
    }); 
}; 

然后,您可以做

require('module') 
    .getIP('username', function(err, ip){ 
     if(err) throw err; 
     console.log(ip); 
    }); 

您还可以使用promises这一点。

var Promise = require('promise'); 

exports.getIP = function(username) { 
    var nexpect = require('nexpect'); 

    return new Promise(function(resolve, reject) { 
     nexpect.spawn("ssh [email protected] docker inspect --format '{{ .NetworkSettings.IPAddress }}' " + username) 
      .expect(" ") 
      .run(function(err, stdout, exitcode) { 
       if (err) { 
        reject(err); 
       } else { 
        ip = stdout; 
        resolve(ip); 
       } 
      }); 
    }) 
}; 

而且

require('module') 
    .getIP('username') 
    .then(function(ip) { 
     console.log(ip); 
    }, function(err) { 
     throw err; 
    }) 
+0

谢谢你,它工作得很好! – esdrasportillo