node.js printer 交互式地从控制台读取值




nodejs控制台输出 (6)

我相信这应该是一个现代async-await答案,假定使用节点> = 7.x。

答案仍然使用ReadLine::question但包装它,以便while (done) {}是可能的,这是OP明确询问的。

var cl = readln.createInterface( process.stdin, process.stdout );
var question = function(q) {
    return new Promise( (res, rej) => {
        cl.question( q, answer => {
            res(answer);
        })
    });
};

然后是一个示例用法

(async function main() {
    var answer;
    while ( answer != 'yes' ) {
        answer = await question('Are you sure? ');
    }
    console.log( 'finally you are sure!');
})();

导致以下对话

Are you sure? no
Are you sure? no
Are you sure? yes
finally you are sure!

我想用一些控制台扩展来制作一个简单的服务器http服务器。 我找到了从命令行数据读取的片段。

  var i = rl.createInterface(process.stdin, process.stdout, null);
  i.question('Write your name: ', function(answer) {
    console.log('Nice to meet you> ' + answer);
    i.close();
    process.stdin.destroy();

  });

以及反复提问,我不能简单地使用while(done) { }循环? 同样,如果服务器在问题时间接收到输出,它就会毁掉这条线。


自12年以来,Readline API发生了很大变化。 该文档显示了一个有用的示例来捕获来自标准流的用户输入:

const readline = require('readline');

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question('What do you think of Node.js? ', (answer) => {
  console.log('Thank you for your valuable feedback:', answer);
  rl.close();
});

更多信息在这里。


我为此使用了另一个API ..

var readline = require('readline');
var rl = readline.createInterface(process.stdin, process.stdout);
rl.setPrompt('guess> ');
rl.prompt();
rl.on('line', function(line) {
    if (line === "right") rl.close();
    rl.prompt();
}).on('close',function(){
    process.exit(0);
});

这允许循环提示,直到答案是right 。 它也提供了很好的控制台。你可以找到详细信息@ http://nodejs.org/api/readline.html#readline_example_tiny_cli


请使用readline-sync ,这可让您使用同步控制台而无需回调地狱。 即使使用密码:

var favFood = read.question('What is your favorite food? ', {
  hideEchoBack: true // The typed text on screen is hidden by `*` (default). 
});


@rob回答在大多数情况下都能正常工作,但它可能无法像您期望的那样使用长输入。

这就是你应该使用的:

const stdin = process.openStdin();
let content = '';

stdin.addListener('data', d => {
  content += d.toString();
});

stdin.addListener('end', () => {
  console.info(`Input: ${content}`);
});

解释为什么此解决方案有效:

addListener('data')像缓冲区一样工作,回调将在满或/和输入结束时调用。

长期投入呢? 一个'data'回调是不够的,因此你会得到你的输入分成两部分或多部分。 这往往不方便。

当stdin读取器完成读取输入时, addListener('end')会通知我们。 由于我们已经存储了以前的数据,现在我们可以一起阅读和处理它们。


你不能做“while(done)”循环,因为这需要阻塞输入,而node.js不喜欢这样做。

相反,每次输入内容时都要设置一个回调函数:

var stdin = process.openStdin();

stdin.addListener("data", function(d) {
    // note:  d is an object, and when converted to a string it will
    // end with a linefeed.  so we (rather crudely) account for that  
    // with toString() and then trim() 
    console.log("you entered: [" + 
        d.toString().trim() + "]");
  });




console