我正在使用heroku API制作一个Web应用程序部署平台。 为了使用heroku API,需要使用heroku CLI登录。我在docker image上安装了heroku CLI,因此,我试图使用nodejs在docker上登录heroku。
Heroku登录是用于在heroku CLI中登录heroku的命令。它需要连续的输入。 (电子邮件和密码)
heroku login
> Email: (you need to input email then password)
但是我下面的代码不起作用。
var spawn = require('child_process').spawn;
login: function(req, callback) {
var result = "";
var heroku_login = spawn('docker', ['exec', '-it', 'my container name', 'heroku', 'login']);
heroku_login.stdin.setEncoding('utf-8');
heroku_login.stdin.write(req.heroku_email);
heroku_login.stdin.write(req.heroku_pwd);
heroku_login.stdout.on('data', function(data) {
result += data.toString();
console.log(result);
}
heroku_login.stdout.on('end', function() {
callback(null, result);
}
}
对我的英语水平感到抱歉。如果您听不懂我的话,请给我评论。
答案 0 :(得分:0)
解决此问题的一种方法是读取已执行的stdout
的{{1}}。然后,您可以使用child
写下一个输入。
一个更完整的示例来证明这一点:
child.stdin.write('data')
在这里,我正在使用const child = exec("leetcode user -l", (err) => {
if (err) {
console.log(err);
} else {
child.stdin.end();
}
});
child.stdout.on("data", (data) => {
if (data.includes("login:")) {
child.stdin.write(`${pref.leetCodeUsername}\r\n`);
} else if (data.includes("pass:")) {
child.stdin.write(`${pref.leetCodePassword}\r\n`);
} else if (data.includes("Successfully")) {
callback(data);
}
});
child.stdout.on("message", (data) => {
console.log(data.toString());
});
执行CLI命令进行Leetcode登录。如果有错误,则将错误记录到控制台,否则,以leetcode user -l
结尾。
然后,使用stdin.end()
阅读您的stdout
在这里,您可以添加连续的输入,也可以根据child.stdout.on("data", (data) => { ... });
的{{1}}包含的内容来灵活输入。就我而言,如果当前提示输入用户名,则“写”用户名;如果密码提示,则“输入”密码。链接到完整的代码:https://github.com/1nv1n/code-goes-here/blob/master/src/leetcode/leetCode.js#L23
将其添加为答案,以便根据@Swivel
在注释中隐藏有用的内容时,不会忽略此问题。