您好,登錄后才能下訂單哦!
小編這次要給大家分享的是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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。