为什么此节点CL会生成多个提示?

时间:2014-09-05 04:48:34

标签: node.js stdin

我在使用stdin / stdout直接使用命令行时注意到节点中的奇怪行为。此程序应提示您输入一些文本,将文本附加到文件fp.txt,然后提示您无限次地再次执行

var fs = require('fs'), stdin = process.stdin, stdout = process.stdout;

function prompt() {
  stdout.write('Enter text: ');
  stdin.resume();
  stdin.setEncoding('utf8');
  stdin.on('data', enter);
}

function enter(data) {
  stdin.pause(); // this should terminate stdin
  fs.open('fp.txt', 'a', 0666, function (error, fp) {   
    fs.write(fp, data, null, 'utf-8', function() {
        fs.close(fp, function(error) {
            prompt();
        });
      });
  });
}

prompt();

第二次输入后,提示将触发两次,然后四次。 (不止我收到警告)

Enter text: foo
Enter text: bar
Enter text: Enter text: baz
Enter text: Enter text: Enter text: Enter text: qux

fp.txt显示1 foo,2 bar,4 baz和8 qux。有没有办法只使用process.stdin和process.stdout来保持单个文本输入循环?

1 个答案:

答案 0 :(得分:1)

每当您致电prompt()时,您都会向stdin添加新的事件监听器。然后,每当您在stdin信息流中输入新信息时,它就会调用您之前添加的所有事件监听器。

您应该在脚本的最开始调用一次(您也可以将setEncoding放在那里):

var fs = require('fs'), stdin = process.stdin, stdout = process.stdout;

stdin.setEncoding('utf8');
stdin.on('data', enter);

function prompt() {
  stdout.write('Enter text: ');
  stdin.resume();
}