小編這次要給大家分享的是Node.js API中如何使用readline模塊,文章內容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
Node.js API詳解之 readline
readline 模塊提供了一個接口,用于從可讀流(如 process.stdin)讀取數據,每次讀取一行。
它可以通過以下方式使用:
const readline = require('readline');readline 模塊的基本用法:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('你認為 Node.js 中文網怎么樣?', (answer) => {
// 對答案進行處理
console.log(`多謝你的反饋:${answer}`);
rl.close();
});注意:當調用該代碼時,Node.js 程序不會終止,直到 readline.Interface 被關閉,因為接口在等待 input 流中要被接收的數據。
說明:
readline.createInterface() 方法會創建一個新的 readline.Interface 實例。
options:
input:要監聽的可讀流。該選項是必需的。
output:要寫入逐行讀取數據的可寫流。
completer:一個可選的函數,用于 Tab 自動補全。
terminal:如果 input 和 output 應被當作一個 TTY,且要寫入 ANSI/VT100 轉換的代碼,則設為 true。 默認為實例化時在 output 流上檢查 isTTY。
historySize:保留的歷史行數的最大數量。 設為 0 可禁用歷史記錄。 該選項只有當 terminal 被用戶或內部 output 設為 true 時才有意義,否則歷史緩存機制不會被初始化。 默認為 30。
prompt:要使用的提示字符串。默認為 ‘> ‘。
crlfDelay:如果 \r 與 \n 之間的延遲超過 crlfDelay 毫秒,則 \r 和 \n 都會被當作換行分隔符。 默認為 100 毫秒。
removeHistoryDuplicates:設置為true時,將從歷史列表中刪除較舊的值。默認為 false。
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});說明:
readline.Interface 類的實例是使用 readline.createInterface() 方法構造的。
每個實例都關聯一個 input 可讀流和一個 output 可寫流。
output 流用于為到達的用戶輸入打印提示,且從 input 流讀取。
說明:
每當 input 流接收到行結束符(\n、\r 或 \r\n)時觸發 ‘line' 事件。
通常發生在用戶按下 鍵或 鍵。
監聽器函數被調用時會帶上一個包含接收的那一行輸入的字符串。
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', (line) => {
console.log(`接收到:${line}`);
});
// 1
// 接收到:1
// 2
// 接收到:2
// 3
// 接收到:3說明:
rl.write() 方法會把 data 或一個由 key 指定的按鍵序列寫入到 output。
data:輸出內容
key:
ctrl: 如果為 true 則表示 ctrl 鍵。
meta: 如果為 true 則表示 Meta 鍵。
shift: 如果為 true 則表示 Shift 鍵。
name: 一個按鍵的名稱。
只有當 output 是一個 TTY 文本終端時,key 參數才被支持。
如果指定了 key,則 data 會被忽略。
當被調用時,如果 input 流已被暫停,則 rl.write() 會恢復 input 流。
如果 readline.Interface 被創建時 output 被設為 null 或 undefined,則 data 和 key 不會被寫入。
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.write('請輸入姓名:');
rl.on('line', (input) => {
//模擬 Ctrl+c 退出進程。
rl.write('', {ctrl: true, name: 'c'});
});說明:
rl.question() 方法通過寫入到 output 來展示 query,并等待用戶提供到 input 的輸入,
然后調用 callback 函數并傳入提供的輸入作為第一個參數。
query:一個在提示符之前、要寫入 output 的敘述或詢問。
callback:一個回調函數,它會被調用并帶上用戶響應 query 的輸入。
當被調用時,如果 input 流已被暫停,則 rl.question() 會恢復 input 流。
如果 readline.Interface 被創建時 output 被設為 null 或 undefined,則 query 不會被寫入。
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('你是誰?', (answer) => {
console.log('你好%s',answer);
});
// 你是誰?xiaoqiang
// 你好xiaoqiang說明:
rl.close() 方法會關閉 readline.Interface 實例,且撤回對 input 和 output 流的控制。
但被調用時,'close' 事件會被觸發。
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.close();說明:
當以下之一發生時,觸發 ‘close' 事件:
rl.close() 方法被調用,且 readline.Interface 實例已撤回對 input 流和 output 流的控制;
input 流接收到 ‘end' 事件;
input 流接收到表示結束傳輸的 ctrl-D;
input 流接收到表示 SIGINT 的 ctrl-C,且 readline.Interface 實例上沒有注冊 SIGINT 事件監聽器。
監聽器函數被調用時不傳入任何參數。
當 ‘close' 事件被觸發時,readline.Interface 實例應當被視為已結束。
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('close', () => {
console.log('已退出......')
});
rl.close();說明:
每當 input 流接收到一個 ctrl-Z 輸入(通常被稱為 SIGTSTP)時,觸發 ‘SIGTSTP' 事件。
當 input 流接收到一個 SIGTSTP 時,如果沒有注冊 ‘SIGTSTP' 事件監聽器,則 Node.js 進程會被發送到后臺。
如果 input 流在進程被發送到后臺之前被暫停,則 ‘pause' 和 SIGCONT 事件不會被觸發。
監聽器函數被調用時不傳入任何參數。
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('SIGTSTP', () => {
console.log('退出請按Ctrl + c');
});說明:
每當 input 流接收到一個 ctrl-C 輸入(通常被稱為 SIGINT)時,觸發 ‘SIGINT' 事件。
當 input 流接收到一個 SIGINT 時,如果沒有注冊 ‘SIGINT' 事件監聽器,則 ‘pause' 事件會被觸發。
監聽器函數被調用時不傳入任何參數。
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('SIGINT', () => {
console.log('已退出...');
rl.close();
});說明:
當一個 Node.js 進程使用 ctrl-Z(也就是 SIGTSTP)移入后臺之后再使用 fg [ job_id ] 移回前臺時,觸發 ‘SIGCONT' 事件。
如果 input 流在 SIGTSTP 請求之前被暫停,則事件不會被觸發。
監聽器函數被調用時不傳入任何參數。
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('SIGCONT', () => {
console.log('已喚起...');
});說明:
rl.prompt() 方法會在 output 流中新的一行寫入 readline.Interface 實例配置后的 prompt,
用于為用戶提供一個可供輸入的新的位置。
preserveCursor:如果為 true,則阻止光標落點被設為 0。
當被調用時,如果 input 流已被暫停,則 rl.prompt() 會恢復 input 流。
如果 readline.Interface 被創建時 output 被設為 null 或 undefined,則提示不會被寫入。
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('你是誰?', (answer) => {
console.log('你好%s',answer);
rl.prompt();
});說明:
rl.setPrompt() 方法用于設置每當 rl.prompt() 被調用時要被寫入到 output 的提示。
prompt:提示內容
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.setPrompt('用戶輸入:');
rl.on('line', (input) => {
console.log(input);
rl.prompt();
});說明:
rl.pause() 方法會暫停 input 流,且稍后需要時可被恢復。
調用 rl.pause() 不會立刻暫停其他事件(包括 ‘line')被 readline.Interface 實例觸發。
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', (input) => {
console.log(input);
rl.pause();
});說明:
當以下之一發生時觸發 ‘pause' 事件:
input 流被暫停。
input 流不是暫停的,且接收到 SIGCONT 事件。
監聽器函數被調用時不傳入任何參數。
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('pause', () => {
console.log('Readline 被暫停。');
});
rl.on('line', (input) => {
console.log(input);
rl.pause();
});說明:
如果 input 流已被暫停,則 rl.resume() 方法會恢復 input 流。
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('line', (input) => {
console.log(input);
rl.pause();
setTimeout( () => {
rl.resume();
},1000);
});說明:
每當 input 流被恢復時觸發 ‘resume' 事件。
監聽器函數被調用時不傳入任何參數
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.on('resume', () => {
console.log('Readline 被恢復。');
});
rl.on('line', (input) => {
console.log(input);
rl.pause();
setTimeout( () => {
rl.resume();
},1000);
});說明:
readline.cursorTo() 方法會移動光標到給定的 TTY stream 中指定的位置。
demo:
const readline = require('readline');
readline.cursorTo(process.stdout, 10, 2);
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.write('我在這?。?!');說明:
readline.moveCursor() 方法會移動光標到給定的 TTY stream 中相對當前的位置。
demo:
const readline = require('readline');
readline.moveCursor(process.stdout, 10, 2);
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.write('我在這?。?!');
// lixiaoqiangdeMacBook-Pro:NodeApi xiaoqiang$ node app.js
// 我在這?。?!說明:
eadline.clearScreenDown() 方法會從光標的當前位置向下清除給定的 TTY 流。
demo:
const readline = require('readline');
readline.clearScreenDown(process.stdout);
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.write('我在這?。?!');說明:
readline.clearLine() 方法會以 dir 指定的方向清除給定的 TTY 流的當前行。
dir:
-1 – 光標左邊
1 – 光標右邊
0 – 整行
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.write('我在這?。?!');
readline.clearLine(process.stdout, -1);說明:
readline.emitKeypressEvents() 方法使給定的可讀流 stream 相應于接收到的輸入觸發 ‘keypress' 事件。
可選的 interface 指定了一個 readline.Interface 實例,用于當自動補全被禁用時檢測到復制粘貼輸入。
如果 stream 是一個 TTY,則它必須為原始模式。
demo:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.write('我在這?。?!');
readline.emitKeypressEvents(process.stdin);const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
const imgArr = ['/', '-', '\\'];
let index = 0;
setInterval(() => {
readline.clearLine(process.stdout, -1);
readline.moveCursor(process.stdout, -1, 0);
rl.write(imgArr[index]);
if(index === 2){
index=0;
}else{
index++;
}
}, 200);const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: '請輸入> '
});
rl.prompt();
rl.on('line', (line) => {
switch (line.trim()) {
case 'hello':
console.log('world!');
break;
default:
console.log(`你輸入的是:'${line.trim()}'`);
break;
}
rl.prompt();
}).on('close', () => {
console.log('再見!');
process.exit(0);
});
// 請輸入> 1
// 你輸入的是:'1'
// 請輸入> hello
// world!
// 請輸入> 再見!const readline = require('readline');
const fs = require('fs');
const rl = readline.createInterface({
input: fs.createReadStream('stdout.log'),
crlfDelay: Infinity
});
rl.on('line', (line) => {
console.log(`文件的單行內容:${line}`);
});
// 文件的單行內容:1
// 文件的單行內容:2
// 文件的單行內容:3
// 文件的單行內容:4
// 文件的單行內容:5
// 文件的單行內容:6
// 文件的單行內容:7
// 文件的單行內容:8
// 文件的單行內容:9
// 文件的單行內容:0看完這篇關于Node.js API中如何使用readline模塊的文章,如果覺得文章內容寫得不錯的話,可以把它分享出去給更多人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。