Javascript process.stdout.write()在Node.js readline CLI程序中不工作

Javascript process.stdout.write()在Node.js readline CLI程序中不工作,javascript,node.js,command-line-interface,readline,Javascript,Node.js,Command Line Interface,Readline,我正在使用该模块为Node.js中的应用程序创建命令行界面(CLI) 问题是我不能像通常在终端中那样向上滚动查看过去的命令。我的CLI只是一个固定窗口,如果我在屏幕上打印的内容太多,就会丢失顶部的信息,无法向上滚动查看 (我正在Mac OSX Mavericks上运行我的程序) 提前谢谢 代码段: var readline = require('readline'); var Cli = function () { this.txtI = process.stdin; this

我正在使用该模块为Node.js中的应用程序创建命令行界面(CLI)

问题是我不能像通常在终端中那样向上滚动查看过去的命令。我的CLI只是一个固定窗口,如果我在屏幕上打印的内容太多,就会丢失顶部的信息,无法向上滚动查看

(我正在Mac OSX Mavericks上运行我的程序)

提前谢谢

代码段:

var readline = require('readline');

var Cli = function () {
    this.txtI = process.stdin;
    this.txtO = process.stdout;

    process.stdout.write('CLI initialized.');

    this.rl = readline.createInterface({input: this.txtI, output: this.txtO });
    this.rl.setPrompt('>>>');
    this.rl.prompt();
    this.rl.on('line', function(line) {
        var input = line.toString().trim();
        if (input) {
            this.txtO.write('cmd: ' + input);
        }
        this.rl.prompt();
    }.bind(this)).on('close', function() {
        this.txtO.write('Have a great day!');
        process.exit(0);
    }.bind(this));
};

new Cli();
将此文件另存为snippet.js并运行

node snippet.js

在终端中。

Readline是一个非常棒的模块。历史已经存在。增加完成的可能性也是如此。请尝试下面的代码片段

var readline = require('readline');

function createCLI(opt) {

    var rl = readline.createInterface({
          input : opt.input,
         output : opt.output,
       terminal : opt.terminal || true,
      completer : opt.completer ||
        function asyncCompleter(linePartial, callback){
          var completion = linePartial.split(/[ ]+/);
          callback(null, [completion, linePartial]);
        }
    });

    rl.on('line', function(line) {
      if( !line.trim() ){  this.prompt();  }
      else { this.write(line); }
    }).on('close', function() {
      this.output.write('\n Have a great day!');
      process.exit(0);
    }).setPrompt(' > ');

    rl.output.write(' CLI initialized\n');
    return rl;
}

var cli = createCLI({
   input : process.stdin,
  output : process.stdout
});

cli.prompt();

Readline是一个非常棒的模块。历史已经存在。增加完成的可能性也是如此。请尝试下面的代码片段

var readline = require('readline');

function createCLI(opt) {

    var rl = readline.createInterface({
          input : opt.input,
         output : opt.output,
       terminal : opt.terminal || true,
      completer : opt.completer ||
        function asyncCompleter(linePartial, callback){
          var completion = linePartial.split(/[ ]+/);
          callback(null, [completion, linePartial]);
        }
    });

    rl.on('line', function(line) {
      if( !line.trim() ){  this.prompt();  }
      else { this.write(line); }
    }).on('close', function() {
      this.output.write('\n Have a great day!');
      process.exit(0);
    }).setPrompt(' > ');

    rl.output.write(' CLI initialized\n');
    return rl;
}

var cli = createCLI({
   input : process.stdin,
  output : process.stdout
});

cli.prompt();

它可能正在工作,只是
readline
正在覆盖您的行。尝试输出多行:

process.stdout.write("1\n2\n3\n4\n5");

它可能正在工作,只是
readline
正在覆盖您的行。尝试输出多行:

process.stdout.write("1\n2\n3\n4\n5");

您想如何显示过去的命令?例如,当您按下向上箭头键时?如果是这样的话,这是您必须实现的。您能介绍一下如何在节点脚本中使用readline吗?我添加了一个精简版的CLI。我似乎已经用这段代码解决了我的滚动问题。我还有一个问题。我似乎无法写入process.stdout流。有什么帮助吗?为什么要用
这个.txtO
变量缓存
进程.stdout
?为什么不直接使用/reference
process.stdout
?我想使用任何流,而不仅仅是process.stdin和process.stdout。我可以将任何流通过管道传输到txtI,并将txtO通过管道传输到任何流。您想展示过去的命令是如何执行的吗?例如,当您按下向上箭头键时?如果是这样的话,这是您必须实现的。您能介绍一下如何在节点脚本中使用readline吗?我添加了一个精简版的CLI。我似乎已经用这段代码解决了我的滚动问题。我还有一个问题。我似乎无法写入process.stdout流。有什么帮助吗?为什么要用
这个.txtO
变量缓存
进程.stdout
?为什么不直接使用/reference
process.stdout
?我想使用任何流,而不仅仅是process.stdin和process.stdout。我可以通过管道将任何流传输到txtI,并将txtO传输到任何流。