如何在node.js中处理标准输出 [英] How to handle stdout in node.js

查看:16
本文介绍了如何在node.js中处理标准输出的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

每次在服务器上测试我的应用程序和站点时,我都会尝试自动执行一个过程。我目前运行的是Nodejitsu。当我测试了一些东西并且它在我的本地计算机上工作时,我做的下一件事是...

  1. 打开我的Package.json文件
  2. 删除域字段,并将名称和子域更改为Staging。(更改版本号也可能有意义)
  3. 然后我jitsu deploy
  4. 确认任何提示(如批准增加版本号)
  5. 应用程序启动后,我会检查我的应用程序在服务器上的工作情况、进行更改等
在我完成之后,我的应用程序可以运行了,我撤销了我在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
'); // Deploy to staging app on nodejitsu.
    setTimeout(function () { // this needs to be replaced
      bash.stdin.write('yes
');
    }, 5000);
    console.log("All done : )");
    // bash.stdin.end(); // close out
  });
});

我这里有几个问题。我非常确定要完成它,我需要知道的是当Nodejitsu提示我递增版本号prompt: Is this ok?: (yes)时触发的事件,以便我可以在发生这种情况时进行确认,以及当整个过程完成时触发的事件,以便我可以恢复对Package.json文件的更改,使我的应用程序部署到临时环境中,并且我的文件基本上保持不变。

推荐答案

我没有在此处设置为运行jitsu deploy。但是,下面的一些代码说明了如何处理提示:

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
");
        // 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.
});

部分解释:

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

    /li>
  2. 正则表达式prompt_re包含‘.*?$’,因为我用来模拟获取提示符的命令对颜色使用转义代码,而我不需要费心与输出的确切代码进行匹配。

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

  4. 它还假定提示文本不能显示为非提示。这是否安全取决于您的特定方案。

我用来模拟正在运行的命令的./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,再次提示,然后退出。

这篇关于如何在node.js中处理标准输出的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆