我們在實現(xiàn)命令行程序的時候,不可避免的要獲取鍵盤輸入咱圆。所以這時候我們就可以使用readline模塊來獲取笛辟。下面讓我們了解一下readline功氨。
什么是Readline
Readline是Node.js里實現(xiàn)標準輸入輸出的封裝好的模塊,該模塊提供了一個接口用來從一個可讀的流中讀取數(shù)據(jù)(比如process.stdin)手幢,每次讀取一行捷凄。
在nodejs的命令行模式下默認引入了readline模塊,但是如果要執(zhí)行node.js腳本文件的話還是需要顯示引入readline模塊围来。
注意:readline適合動態(tài)交互式流處理跺涤,類似于C++命令行中的cin和cout。不是我們平常意義上說的按行讀取文件管钳。當流被創(chuàng)建時钦铁,readline只會監(jiān)聽新增的行而忽略已有的行。
使用Readline
我們通過一個實例來學習如何使用Readline才漆,主要包括三個方面
- 創(chuàng)建Readline實例
- 學習里面的接口方法
- 學習監(jiān)聽與處理Readline事件
//引入readline模塊
const readline = require('readline');
//創(chuàng)建readline接口實例
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// question方法
rl.question('Please input a word: ', function(answer){
console.log('You have entered {%s}', answer.toUpperCase());
// 不加close牛曹,則不會結(jié)束
rl.close();
});
運行結(jié)果:
? toUpperCase git:(master) ? node app.js
Please input a word: hello
You have entered {HELLO}
通過這個例子,我們已經(jīng)很清晰的看到了Readline的使用方法醇滥。
下面讓我們再看一個例子
var readline = require('readline');
var rl = readline.createInterface(process.stdin, process.stdout);
/*
* 方法setPromat(promat)黎比,就是給每一行設(shè)置一個提示符,就好比window命令行的> 鸳玩,我們這里設(shè)置的是Test>
* promat()可以算是最重要的方法了阅虫,因為它才體現(xiàn)了Readline的核心作用,以行為單位讀取數(shù)據(jù)不跟,premat方法就是在等待用戶輸入數(shù)據(jù)
* 這里又監(jiān)聽了’line’ 事件颓帝,因為promat方法調(diào)用一次就只會讀取一次數(shù)據(jù),所以窝革,在這個方法又調(diào)用了一次promat方法购城,這樣就可以繼續(xù)讀取用戶輸入,從而達到一種命令行的效果
*/
rl.setPrompt('Test> ');
rl.prompt();
rl.on('line', function(line) {
switch(line.trim()) {
case 'copy':
console.log("復制");
break;
case 'hello':
console.log('world!');
break;
case 'close':
rl.close();
break;
default:
console.log('沒有找到命令虐译!');
break;
}
rl.prompt();
});
rl.on('close', function() {
console.log('bye bye!');
process.exit(0);
});
Test> copy
復制
Test> hello
world!
Test> world
沒有找到命令瘪板!
Test> close
bye bye!
參考資料:官方的API
【Node.js基礎(chǔ)篇】(九)使用readline模塊實現(xiàn)Node.js的輸入輸出
Nodejs進階:readline實現(xiàn)日志分析+簡易命令行工具