php和nodejs和readline,Node.js之readline模組的使用

什麼是readline

readline允許從可讀流中以逐列的方式讀取資料,例如process.stdin等。

在node.js命令列模式下預設引入了readline模組,但如果是使用node.js執行腳本的話,則需要自己透過require('readline')方式手動引入該模組。

怎麼使用readline

建立例項

首先、建立一個介面例項,提供一個Object型別的引數。引數如下:

input: 監聽的可讀流(必需)

output: 寫入readline的可寫流(必需)

completer: 用於 Tab 自動補全的可選函式(不常用)

terminal: 如果希望 input 和 output 流像 TTY 一樣對待,那麼傳遞引數 true ,並且經由 ANSI/VT100 轉碼。 預設情況下檢查 isTTY 是否在 output 流上例項化。(不常用)

historySize: 保留行歷史紀錄最大值,為了禁用該值被設定為0,預設為30,衹有在terminal被設定為true或透過一個內部輸出檢查時,這個選項才有作用,否則歷史快取機制不會初始化。(不常用)

第一種方式:只傳入兩個必傳引數

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所建立:

const readLine = require('readline');

let rl = readLine.createInterface({

input: process.stdin,

output: process.stdout

})

複製程式碼

1、rl.setPrompt([prompt])

設定提示符,當你使用node執行該檔案,並且呼叫rl.prompt()時,會在終端看到你設定的提示prompt,即「> 請輸入」

rl.setPrompt('> 請輸入')

複製程式碼

注意:該方法和上面的例項引數配置是一樣的效果

2、rl.prompt([preserveCursor])

為使用者輸入準備好readline,將現有的setPrompt選項放到新的一行,讓使用者有一個新的地方開始輸入。將preserveCursor設為true來防止游標位置被重新設定成0。

如需要換行輸入,即在新的一行,輸入訊息,可在prompt中加入

rl.prompt(); // 主控臺結果顯示:>請輸入

複製程式碼

3、rl.write(data[, key])

當使用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'});

複製程式碼

4、rl.question(query, callback)

預先制定提示內容query,將會在使用者輸入被應答後,觸發執行指定的回掉函式callback。

rl.question('你今年多大了?
', function(prompt) {

console.log('這是你輸入的回答結果:' + prompt);

rl.close();

})

複製程式碼

5、rl.pause()

暫停readline的輸入流,可以恢復,rl.resume()、rl.write()、rl.question()和rl.prompt()均可以恢復該輸入流。

呼叫該方法會觸發pause事件。

6、rl.resume()

恢復readline的輸入流。

呼叫該方法會觸發resume事件。

7、rl.close()

關閉readline建立的例項,不控制輸入輸出流。

呼叫該方法會觸發close事件。

事件

1、line事件

無論何時,在輸入流接收了一個行結束符(
,
, 或者
)時觸發,即在使用者輸入後,按了回車或者回傳鍵時觸發該事件。可以用來監聽使用者輸入。

rl.on('line', function (line) {

console.log('這是使用者輸入的內容:' + line);

})

複製程式碼

2、pause事件

輸入流被暫停時觸發,即呼叫了rl.pause(),或者沒有暫停輸入流,在收到 SIGCONT/SIGINT,且readline.Interfacce例項上並沒有註冊SIGCONT/SIGINT監聽器時,也會被觸發,並且如果輸入流在收到SIGTSIP之前就已經被暫停了,那麼該事件也不會觸發。

rl.on('pause', function() {

console.log('暫停輸入流...')

})

複製程式碼

3、resume事件

輸入流重新啟動時被觸發,即呼叫了rl.resume()、或者rl.write()、rl.question()和rl.prompt()。

rl.on('resume', function() {

console.log('恢復輸入流...')

})

複製程式碼

4、close事件

呼叫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); // 退出當前行程

})

複製程式碼

5、SIGCOUT(該事件在window系統上不起作用)

當使用-Z將Node.js行程移動到後台時,SIGCONT事件將會被觸發。然後可以使用 fg(1) 命令將它移動到前台。

如果輸入流在收到SIGTSIP之前就已經被暫停了,那麼該事件就不會觸發。

6、SIGINT

當輸入流收到-C命令時,我們熟知的SIGINT事件就會被觸發。如果當時並沒有註冊任何SIGINT事件監聽器,那麼當輸入流接收到SIGINT訊號時,』pause』事件和』close』事件均會被觸發。

7、SIGTSTP(該事件在window系統上不起作用)

當輸入流收到-Z命令時,我們熟知的SIGTSTP事件就會被觸發。如果沒有註冊SIGTSTP事件監聽器,那麼當輸入流收到SIGTSTP事件時,Node.js行程就將會被移動到後台。

如果輸入在行程被發送到後台之前就已經被暫停了,那麼』pause』和』SIGCONT』事件就將不會被觸發。

參見官方檔案

參考範例看笑話readline