什么是readlinereadline允许从可读流中逐行读取数据,例如process.stdin等。node.js命令行方式默认引入了readline模块,但如果使用node.js运行脚本,需要通过require('readline')手动导入模块。如何使用readline创建实例首先,创建一个接口实例,提供一个Object类型的参数。参数如下:input:要监听的可读流(必填)output:写入readline的可写流(必填)completer:Tab自动补全的可选功能(不常用)terminal:如果要输入和输出流要像TTY一??样处理,然后传递参数true,并通过ANSI/VT100转码。默认情况下,检查isTTY在输出流上实例化。(不常用)historySize:保留行历史的最大值,禁用此值设置为0,默认为30,此选项仅在终端设置为true或通过内部输出检查时有效,否则历史缓存机制将不会被初始化。(不常用)第一种方法:只传入两个必填参数constreadLine=require('readline');让rl=readLine.createInterface(process.stdin,process.stdout);第二种方法:可以通过Enter其他非必需的参数constreadLine=require('readline');letrl=readLine.createInterface({input:process.stdin,output:process.stdout,//省略其他参数})instanceconstreadLine=require('readline');letrl=readLine.createInterface({input:process.stdin,output:process.stdout,prompt:'>请输入'})//callrl.prompt();//consoleresultdisplay:>pleaseEnter注意:一旦调用这段代码,Node.js程序不会终止,直到readline接口关闭,因为接口会一直等待输入中的数据溪流。method下面的所有实例都是根据下面的rl创建的:constreadLine=require('readline');letrl=readLine.createInterface({input:process.stdin,output:process.stdout})1、rl.setPrompt([prompt])设置提示符。当你使用node运行文件,调用rl.prompt()时,你会在终端看到你设置的prompt提示符,即">Pleaseenter"rl.setPrompt('>Pleaseenter')注意:该方法与上述实例参数配置效果相同2。rl.prompt([preserveCursor])为用户输入准备readline,并将现有的setPrompt选项转换为一个新行,因此用户有一个新的地方开始输入。将preserveCursor设置为true,防止光标位置被重置为0。如果需要换行,即换行输入信息,可以在提示符后加n。rl.prompt();//控制台结果显示:>Pleaseenter3,rl.write(data[,key])使用readline.createInterface()创建实例时,如果输入流为null或undefined,则将输入数据写入输出流.key是表示一系列键的文字对象,如果终端是TTY则可用。rl.write('删除我!');//模拟ctrl+u删除之前写入的行rl.write(null,{ctrl:true,name:'u'});4.rl.question(query,callback)预先确定提示内容query,在回答用户输入后会触发执行指定的回调函数callback。rl.question('你今年几岁?\n',function(prompt){console.log('这是你输入的答案:'+prompt);rl.close();})5、rl.pause()暂停readline的输入流,可以恢复。rl.resume()、rl.write()、rl.question()和rl.prompt()都可以恢复输入流。调用此方法将触发暂停事件。6.rl.resume()恢复readline的输入流。调用此方法将触发resume事件。7.rl.close()关闭readline创建的实例,不控制输入输出流。调用此方法将触发关闭事件。事件1、行事件每当输入流接收到行结束符(n、r或rn)时触发,即用户输入后,按下回车或回车键时触发该事件。可用于监听用户输入。rl.on('line',function(line){console.log('Thisiswhattheuserentered:'+line);})2.输入流暂停时触发pause事件,即rl.pause(),或者没有暂停输入流,收到SIGCONT/SIGINT,readline.Interfacce实例没有注册SIGCONT/SIGINTlistener它也会在服务器关闭时触发,如果输入流在接收到SIGTSIP之前已经暂停,则不会触发。rl.on('pause',function(){console.log('pausetheinputstream...')})3.resume事件在输入流重启时触发,即调用rl.resume(),或rl.write()、rl.question()和rl.prompt()。rl.on('resume',function(){console.log('resumeinputstream...')})4.close事件当rl.close()方法被调用,或者输入流接收“结束”事件。以下任何一种情况都会触发关闭事件。一旦关闭事件被触发,readline.Interaface实例就被认为终止了。1)调用rl.close()方法后,readline.Interaface实例将放弃对输入输出流的控制。2)输入流接收它自己的“结束”事件。3)输入流接收到-C,发送SIGINT信号,并没有在readline上注册SIGINT接口实例A事件的监听器。4)、输入流接收-D,发送传输结束信号(EOF,end-of-transmission);5)、EOT:分隔符,即输入一个或多个“>”,按回车时间。rl.on('close',function(){console.log('关闭输入流...');process.exit(0);//退出当前进程})5、SIGCOUT(这个事件是on窗口系统不工作)当使用-Z将Node.js进程移动到后台时,将触发SIGCONT事件。然后可以使用fg(1)命令将其移动到前台。如果在接收SIGTSIP之前输入流已暂停,则不会触发此事件。6.SIGINT当输入流接收到-C命令时,会触发众所周知的SIGINT事件。如果此时没有注册SIGINT事件侦听器,则当输入流接收到SIGINT信号时,将触发“暂停”事件和“关闭”事件。7、SIGTSTP(该事件在window系统上不起作用)当输入流接收到-Z命令时,就会触发众所周知的SIGTSTP事件。如果没有注册SIGTSTP事件侦听器,则当输入流接收到SIGTSTP事件时,Node.js进程将移至后台。如果输入在进程发送到后台之前暂停,则不会触发“暂停”和“SIGCONT”事件。看官方文档参考案例看笑话