📜  Node.js Readline() 模块

📅  最后修改于: 2022-05-13 01:56:53.429000             🧑  作者: Mango

Node.js Readline() 模块

Node.js 中的Readline 模块允许逐行读取输入流。该模块封装了处理标准输出和处理标准输入对象。 Readline 模块使输入和读取用户给出的输出变得更容易。要使用此模块,请创建一个新的 JavaScript 文件并在应用程序开始时编写以下代码 -

var readline = require('readline');

Readline 模块带有与用户交互的不同方法。
与用户的交互:对于交互,我们将首先为输入和输出创建一个接口。要创建接口,请编写以下代码 -

javascript
var readline = require('readline');
  
var rl = readline.createInterface(
     process.stdin, process.stdout);


javascript
rl.question('What is your age? ', (age) => {
    console.log('Your age is: ' + age);
});


javascript
rl.question('What is your age? ', (age) => {
    console.log('Your age is: ' + age);
    rl.close();
});


javascript
var readline = require('readline');
  
var rl = readline.createInterface(
        process.stdin, process.stdout);
  
rl.setPrompt(`What is your age? `);
rl.prompt()


javascript
var readline = require('readline');
  
var rl = readline.createInterface(
        process.stdin, process.stdout);
  
rl.setPrompt(`What is your age? `);
rl.prompt();
rl.on('line', (age) => {
    console.log(`Age received by the user: ${age}`);
    rl.close();
});


javascript
rl.on('line', (input) => {
    console.log(`Input Received: ${input}`);
    rl.close();
});


javascript
rl.on('pause', () => {
    console.log('Paused Event is invoked');
});


javascript
rl.on('resume', () => {
        console.log('Resume Event is invoked.');
});


javascript
rl.on('SIGINT', () => {
    rl.question('Exit (y or n)? ', (input) => {
      if (input.match(/^y(es)?$/i)) { rl.pause(); }
    });
});


javascript
rl.on('SIGTSTP', () => {
    console.log('SIGTSTP event is invoked.');
})


javascript
rl.on('SIGCONT', () => {
     console.log('SIGCONT event is invoked.');
     rl.prompt();
})


这里, createInterface()方法有两个参数。第一个参数用于标准输入,第二个参数用于读取标准输出。

javascript

rl.question('What is your age? ', (age) => {
    console.log('Your age is: ' + age);
});

在这里, rl.question()方法用于向用户提问并阅读他们的回复(输出)。第一个参数用于提问,第二个参数是一个回调函数,它将用户的输出作为参数返回到控制台。
上述代码的输出将是 -

What is your age? 20
Your age is: 20

在这里,问题是它不会退出应用程序,它会继续要求输入。为了解决这个问题,使用了 rl.close()方法。此方法将关闭界面。要在应用程序中使用它,请编写以下内容 -

javascript

rl.question('What is your age? ', (age) => {
    console.log('Your age is: ' + age);
    rl.close();
});

我们也可以使用一个setPrompt()方法来设置特定的语句到控制台。 prompt()方法用于显示在 setPrompt() 方法中设置的语句。因此,编写以下代码 -

javascript

var readline = require('readline');
  
var rl = readline.createInterface(
        process.stdin, process.stdout);
  
rl.setPrompt(`What is your age? `);
rl.prompt()

此代码将接受用户的输入。现在,我们需要一个监听器来读取用户的输入并将其显示到控制台。为此, Readline Module调用一个侦听器方法,该方法将采用两个参数。第一个参数是事件,第二个参数是一个回调函数,它将输出返回到控制台。例如 -

javascript

var readline = require('readline');
  
var rl = readline.createInterface(
        process.stdin, process.stdout);
  
rl.setPrompt(`What is your age? `);
rl.prompt();
rl.on('line', (age) => {
    console.log(`Age received by the user: ${age}`);
    rl.close();
});

在这里, rl.on()方法将第一个参数作为线路事件。每当用户按下 Enter键时,都会调用此事件。上述代码的输出将是 -

What is your age? 20
Age received by the user: 20

事件:除了监听器,readline 模块还带有事件属性。让我们了解各种事件。

  • close:当调用rl.close()方法或用户按ctrl + c关闭界面时,将调用此事件。
  • line:每当用户按下Enter返回键时都会调用此事件。此事件在侦听函数中调用。例如 -

javascript

rl.on('line', (input) => {
    console.log(`Input Received: ${input}`);
    rl.close();
});
  • pause:输入流暂停时调用此事件。例如 -

javascript

rl.on('pause', () => {
    console.log('Paused Event is invoked');
});
  • 上述代码的输出将是 -
Paused Event is invoked
  • resume:只要恢复输入,就会调用此事件。例如 -

javascript

rl.on('resume', () => {
        console.log('Resume Event is invoked.');
});
  • SIGINT:只要用户按下ctrl + c按钮,就会调用此事件。如果调用 SIGINT 时没有注册事件侦听器,则将调用pause事件。例如 -

javascript

rl.on('SIGINT', () => {
    rl.question('Exit (y or n)? ', (input) => {
      if (input.match(/^y(es)?$/i)) { rl.pause(); }
    });
});
  • 如果用户按下ctrl + c键,此代码将询问给定的问题。在这里,如果提供的输入与 y 或 yes 匹配,则将在接口上调用 pause() 方法。
  • SIGTSTP:只要用户给出ctrl + z输入,就会调用此事件。此输入称为 SIGTSTP。如果用户没有提供 SIGTSTP 输入,那么当前正在运行的进程将被发送到后台。例如 -

javascript

rl.on('SIGTSTP', () => {
    console.log('SIGTSTP event is invoked.');
})
  • SIGCONT:当使用SIGTSTP发送到后台的进程再次被带回前面运行的进程时,将调用此事件。例如 -

javascript

rl.on('SIGCONT', () => {
     console.log('SIGCONT event is invoked.');
     rl.prompt();
})

结论:在本文中,我们了解了 Node.js 中的Readline 模块。此外,我们使用方法、变量、事件和侦听器了解了它的各种实现。