如何从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;
})
谢谢你,它工作得很好! – esdrasportillo