我在使用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来保持单个文本输入循环?
答案 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();
}