readline容许从可读流中以逐行的方式读取数据,好比process.stdin等。 在node.js命令行模式下默认引入了readline模块,但若是是使用node.js运行脚本的话,则须要本身经过require('readline')方式手动引入该模块。html
首先、建立一个接口实例,提供一个Object类型的参数。参数以下: input: 监听的可读流(必需) output: 写入readline的可写流(必需) completer: 用于 Tab 自动补全的可选函数(不经常使用) terminal: 若是但愿 input 和 output 流像 TTY 同样对待,那么传递参数 true ,而且经由 ANSI/VT100 转码。 默认状况下检查 isTTY 是否在 output 流上实例化。(不经常使用) historySize: 保留行历史纪录最大值,为了禁用该值被设置为0,默认为30,只有在terminal被设置为true或经过一个内部输出检查时,这个选项才有做用,不然历史缓存机制不会初始化。(不经常使用)node
const readLine = require('readline');
let rl = readLine.createInterface(process.stdin, process.stdout);
复制代码
const readLine = require('readline');
let rl = readLine.createInterface({
input: process.stdin,
output: process.stdout,
// 其余参数省略
})
复制代码
const readLine = require('readline');
let rl = readLine.createInterface({
input: process.stdin,
output: process.stdout,
prompt: '> 请输入'
})
// 调用
rl.prompt(); // 控制台结果显示:>请输入
复制代码
注意:一旦该代码被调用,Node.js程序将不会终止知道readline接口被关闭,由于接口会在输入流中不停的等待数据。缓存
如下全部的实例均依据以下rl所建立:bash
const readLine = require('readline');
let rl = readLine.createInterface({
input: process.stdin,
output: process.stdout
})
复制代码
设置提示符,当你使用node运行该文件,而且调用rl.prompt()时,会在终端看到你设置的提示prompt,即“> 请输入”函数
rl.setPrompt('> 请输入')
复制代码
注意:该方法和上面的实例参数配置是同样的效果ui
为用户输入准备好readline,将现有的setPrompt选项放到新的一行,让用户有一个新的地方开始输入。将preserveCursor设为true来防止光标位置被从新设定成0。 如须要换行输入,即在新的一行,输入信息,可在prompt中加入\n。spa
rl.prompt(); // 控制台结果显示:>请输入
复制代码
当使用readline.createInterface()建立实例时,,若是输入流为null或者undefined,则写入数据到输出流。 key是一个表示键序列的字面量对象,若是终端是TTY,则可用。命令行
rl.write('Delete me!');
// Simulate ctrl+u to delete the line written previously
rl.write(null, {ctrl: true, name: 'u'});
复制代码
预先制定提示内容query,将会在用户输入被应答后,触发执行指定的回掉函数callback。code
rl.question('你今年多大了?\n', function(prompt) {
console.log('这是你输入的回答结果:' + prompt);
rl.close();
})
复制代码
暂停readline的输入流,能够恢复,rl.resume()、rl.write()、rl.question()和rl.prompt()都可以恢复该输入流。 调用该方法会触发pause事件。htm
恢复readline的输入流。 调用该方法会触发resume事件。
关闭readline建立的实例,不控制输入输出流。 调用该方法会触发close事件。
不管什么时候,在输入流接收了一个行结束符(\n, \r, 或者 \r\n)时触发,即在用户输入后,按了回车或者返回键时触发该事件。能够用来监听用户输入。
rl.on('line', function (line) {
console.log('这是用户输入的内容:' + line);
})
复制代码
输入流被暂停时触发,即调用了rl.pause(),或者没有暂停输入流,在收到 SIGCONT/SIGINT,且readline.Interfacce实例上并无注册SIGCONT/SIGINT监听器时,也会被触发,而且若是输入流在收到SIGTSIP以前就已经被暂停了,那么该事件也不会触发。
rl.on('pause', function() {
console.log('暂停输入流...')
})
复制代码
输入流从新启动时被触发,即调用了rl.resume()、或者rl.write()、rl.question()和rl.prompt()。
rl.on('resume', function() {
console.log('恢复输入流...')
})
复制代码
调用rl.close()方法时会触发该事件,或者输入流接收到“结束”事件。如下的任意一种状况都会触发close事件。 一旦close事件被触发,则认为readline.Interaface实例已经终止。 1)、rl.close()方法被调用后,readline.Interaface实例便会放弃输入输出流的控制权。 2)、输入流接收到本身的“end”事件。 3)、输入流接收到-C,发送SIGINT信号,而且在readline.Interfacce实例上并无注册SIGINT事件的监听器。 4)、输入流接收到-D,发送传输结束信号(EOF,end-of-transmission); 5)、EOT:定界符,即输入单个或多个“>”,并按下回车时。
rl.on('close', function() {
console.log('关闭输入流...');
process.exit(0); // 退出当前进程
})
复制代码
当使用-Z将Node.js进程移动到后台时,SIGCONT事件将会被触发。而后可使用 fg(1) 命令将它移动到前台。 若是输入流在收到SIGTSIP以前就已经被暂停了,那么该事件就不会触发。
当输入流收到-C命令时,咱们熟知的SIGINT事件就会被触发。若是当时并无注册任何SIGINT事件监听器,那么当输入流接收到SIGINT信号时,’pause’事件和’close’事件均会被触发。
当输入流收到-Z命令时,咱们熟知的SIGTSTP事件就会被触发。若是没有注册SIGTSTP事件监听器,那么当输入流收到SIGTSTP事件时,Node.js进程就将会被移动到后台。 若是输入在进程被发送到后台以前就已经被暂停了,那么’pause’和’SIGCONT’事件就将不会被触发。