Node.js-如何使用spawn或exec连续输入?

时间:2018-09-27 02:44:30

标签: node.js docker heroku spawn

我正在使用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);
    }
}

对我的英语水平感到抱歉。如果您听不懂我的话,请给我评论。

1 个答案:

答案 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

在注释中隐藏有用的内容时,不会忽略此问题。