如何在node.js中处理stdout

如何在node.js中处理stdout,node.js,bash,stdout,std,stdin,Node.js,Bash,Stdout,Std,Stdin,我正在尝试将每次在服务器上测试我的应用程序和站点时所经历的过程自动化。我现在在nodejitsu上运行。当我测试了一些东西并且它在我的本地机器上工作时,我接下来要做的就是 打开mypackage.json文件 删除域字段并将名称和子域更改为暂存。(更改版本号也可能有意义) 然后我jitsu部署 确认任何提示(如批准版本号的增量) 一旦应用程序启动,我会检查我的应用程序在服务器上的工作情况,进行更改等等 完成后,我的应用程序准备就绪,我将撤消在package.json文件中所做的更改。我想自动化这

我正在尝试将每次在服务器上测试我的应用程序和站点时所经历的过程自动化。我现在在nodejitsu上运行。当我测试了一些东西并且它在我的本地机器上工作时,我接下来要做的就是

  • 打开mypackage.json文件
  • 删除域字段并将名称和子域更改为暂存。(更改版本号也可能有意义)
  • 然后我
    jitsu部署
  • 确认任何提示(如批准版本号的增量)
  • 一旦应用程序启动,我会检查我的应用程序在服务器上的工作情况,进行更改等等
  • 完成后,我的应用程序准备就绪,我将撤消在package.json文件中所做的更改。我想自动化这个过程。我的想法是使用一个很小的node.js文件。到目前为止

    /*
     * Use this file to deploy an app to the staging server on nodejitsu
     */
    var bash = require('child_process').spawn('bash');
    var colors = require('colors');
    var fs = require('fs');
    
    // stdout setup
    bash.stdout.on('data', function (data) {
      console.log('stdout: ' + data);
    });
    bash.stdout.on('error', function (err) {
      console.log('stdout error: '.red, err);
    });
    
    // on bash exit
    bash.on('exit', function (code) {
      console.log('Exiting... ', code);
    });
    
    // grab package.json
    var package = '';
    fs.readFile('package.json', {encoding: 'utf-8'}, function (err, data) { // grab the package.json file contents
      if (err) throw err;
      package = JSON.parse(data);
      fs.rename('package.json', 'rename-me-before-deploying.json'); // rename the package.json file
      package.name = 'stajing'; // alter json
      package.subdomain = 'stajing'; // alter json
      package.domains = []; // alter json
      fs.writeFile('package.json', JSON.stringify(package, null, 2), function(err) { // write the new package to package.json
        if (err) throw err;
        bash.stdin.write('jitsu deploy\n'); // Deploy to staging app on nodejitsu.
        setTimeout(function () { // this needs to be replaced
          bash.stdin.write('yes\n');
        }, 5000);
        console.log("All done : )");
        // bash.stdin.end(); // close out
      });
    });
    

    我这里有几个问题。我很确定要完成它,我需要知道的是当nodejitsu提示我增加版本号时触发的事件
    提示:这可以吗?:(是)
    ,这样我就可以确认,如果发生这种情况,以及在整个过程结束时触发的事件,这样我就可以将更改还原到我的package.json文件,让我的应用程序部署到一个临时环境,而我的文件基本上不受影响

    我不是在这里运行柔术部署的。但是,以下代码说明了如何处理提示:

    var command = require('child_process').spawn('./command.js');
    require('colors');
    
    var stdout = "";
    var prompt_re = /Is it okay \(yes\)\?.*?$/m;
    command.stdout.on('data', function (data) {
        console.log("stdout data: ".green + data);
        stdout += data;
        if (prompt_re.test(stdout)) {
            command.stdin.write("yes\n");
            // Flush the current buffer.
            stdout = "";
        }
    });
    
    command.stdout.on('error', function (err) {
        console.log('stdout error: '.red, err);
    });
    
    var exit_msg = 'Exited with code... ';
    command.on('exit', function (code) {
        if (code != 0) {
            console.log(exit_msg.red, code);
            process.exit(1); // Or whatever you want to handle errors.
        }
    
        console.log(exit_msg.green, code);
        // The code you want to execute once your command is done goes here.
    });
    
    一些解释:

  • 上面的代码将从
    command.stdout
    获取的数据缓冲到
    stdout
    变量中存储的字符串中,并对其进行测试,因为如果有大量输出,则无法保证提示符将在单个
    data
    事件中到达。(例如,它可能出现在一个包含大量数据的事件中+字符串
    Is It
    ,然后下一个
    data
    事件可能包含提示的其余部分。)

  • 正则表达式
    prompt\u re
    包含“.*?$”,因为我用来模拟获取提示的命令使用转义码来表示颜色,我无法与输出的确切代码进行匹配

  • 此代码假定命令在输出提示后立即停止并在那里等待。这似乎是一个安全的假设

  • 它还假定提示文本不能显示为非提示的内容。这是否安全取决于您的具体情况

  • 我用来模拟正在运行的命令的
    /command.js
    文件是:

    #!/usr/bin/env node
    
    var prompt = require("prompt");
    
    function ask(cb) {
        prompt.get(["Is it okay (yes)?"], function (err, result) {
            console.log("asked");
            cb();
        });
    }
    
    setTimeout(function () {
        ask(function () {
            setTimeout(function () {
                ask(function () { process.exit(0); });
            }, 1000);
        });
    }, 5000);
    

    它等待5s,提示一次,等待1s,提示第二次,然后退出。

    未定义的
    似乎来自
    'exit'
    事件,如
    colors
    。你太棒了!!!!!!!(感叹号是Stackoverflow评论的最小字符数)你的问题是什么?顺便说一句,你到底为什么要操纵package.json?你不应该非得这么做。处理特定于环境的配置有不同的可能性。我最后提出了另一个问题(此处:),最终我需要这样做:我同意您不需要操纵package.json文件,但我无法找到在服务器上测试我的应用程序的另一种方法,因为它将用于生产。我可以在本地进行测试,但一旦部署,它就会启动(据我所知,与NODE_ENV无关)。因此,我用一个无人机设置了一个单独的“应用程序”来测试我的网站/应用程序。感谢路易斯的帮助,下面是我最后做的: