如何从Nexpect方法中获取变量?

时间:2014-07-09 11:15:21

标签: node.js expect

我在Docker中运行Nexpect,我需要获取另一个docker容器的IP,所以我ssh进入主机并使用Nexpect运行一个方法来获取IP地址,但我不知道为什么方法返回null,这里是方法的代码:

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

   nexpect.spawn("ssh core@172.17.8.101 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;
};

1 个答案:

答案 0 :(得分:0)

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

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

   nexpect.spawn("ssh core@172.17.8.101 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 core@172.17.8.101 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;
    })