【问题标题】:Node.js - How to input successively using spawn or exec?Node.js - 如何使用 spawn 或 exec 连续输入?
【发布时间】:2018-09-27 02:44:30
【问题描述】:

我正在使用 heroku API 制作一个 web-app-deployment-platform。 为了使用 heroku API,它需要使用 heroku CLI 登录。我让 docker image 安装了 heroku CLI 所以,我正在尝试使用 nodejs 在 docker 上登录 heroku。

Heroku login 是在 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);
    }
}

对不起我的英语水平。如果你不明白我的话,请给我评论。

【问题讨论】:

  • 我也有类似的问题。似乎还没有答案;但如果你自己解决了这个问题;你能发布答案吗?
  • @Neil 我已经通过调用 http api 解决了。 exec('curl -nX GET https://api.heroku.com/apps -H "Accept: application/vnd.heroku+json; version=3" -H "Authorization: Bearer ' + api_key + '"' , function(err, stdout, stderr) { ...`
  • 酷。我最终通过在child.stdout.on("data", (data) => {... 中检查data 然后在该检查中调用child.stdin.write(...) 解决了我的问题。
  • @Neil 讨厌唤醒一匹早已死去的马再次被打败,但你介意把它放在一个正式的答案中,这样它就不会过目了吗?当它隐藏在评论中时,很容易忽略解决方案,对于我们这些通过谷歌搜索遇到十几个或更多 SO 问题的人来说:D

标签: node.js docker heroku spawn


【解决方案1】:

解决此问题的一种方法是读取您执行的childstdout。然后,您可以使用 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());
});

这里我正在使用leetcode user -l 执行 Leetcode 登录的 CLI 命令。如果有错误,则将错误记录到控制台,否则使用stdin.end()结束。

然后,使用child.stdout.on("data", (data) => { ... }); 阅读您的stdout 在这里,您可以添加您的连续输入,或根据您的stdoutdata 包含的内容来调整您的输入。就我而言,如果当前提示是用户名,我会“写”用户名,如果是密码提示,我会“写”密码。完整代码链接:https://github.com/1nv1n/code-goes-here/blob/master/src/leetcode/leetCode.js#L23

添加这个作为答案,这样当评论中隐藏了有用的东西时,这个问题就不会被忽视,@Swivel

【讨论】:

    猜你喜欢
    • 2014-11-13
    • 1970-01-01
    • 2016-08-01
    • 2019-01-05
    • 2018-10-28
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    相关资源
    最近更新 更多