2014-07-09 41 views
0

我從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; 
}; 

回答

0

由於它是異步的,你返回值立刻當它尚未在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