rustybeanstalk
rustybeanstalk

Reputation: 2762

process.stdout.write() not working in Node.js readline CLI program

I am using the readline module to create a command line interface (CLI) for an application in Node.js.

The problem is that I can not scroll up to view the past commands as I usually can in Terminal. My CLI is just a fixed window and if I print too much out to the screen, I lose information at the top and there is no way to scroll up to see it.

(I am running my program on Mac OSX Mavericks)

Thanks in advance.

Code Snippet:

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();

Save this file as snippet.js and run

node snippet.js

in terminal.

Upvotes: 2

Views: 7644

Answers (2)

Vad
Vad

Reputation: 4099

It probably is working, just readline is overwriting your line. Try outputting multiple lines:

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

Upvotes: 4

stringparser
stringparser

Reputation: 745

Readline is quite an awesome module. History is already there. As is the possibility to add completion. Try the snippet below.

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();

Upvotes: 2

Related Questions