Node.js之readline模塊的使用

什麼是readline

readline容許從可讀流中以逐行的方式讀取數據,好比process.stdin等。 在node.js命令行模式下默認引入了readline模塊,但若是是使用node.js運行腳本的話,則須要本身經過require('readline')方式手動引入該模塊。html

怎麼使用readline

建立實例

  首先、建立一個接口實例,提供一個Object類型的參數。參數以下: input: 監聽的可讀流(必需) output: 寫入readline的可寫流(必需) completer: 用於 Tab 自動補全的可選函數(不經常使用) terminal: 若是但願 input 和 output 流像 TTY 同樣對待,那麼傳遞參數 true ,而且經由 ANSI/VT100 轉碼。 默認狀況下檢查 isTTY 是否在 output 流上實例化。(不經常使用) historySize: 保留行歷史紀錄最大值,爲了禁用該值被設置爲0,默認爲30,只有在terminal被設置爲true或經過一個內部輸出檢查時,這個選項纔有做用,不然歷史緩存機制不會初始化。(不經常使用)node

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

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

const readLine = require('readline');
  let rl = readLine.createInterface({
    input: process.stdin,
    output: process.stdout
  })
複製代碼
一、rl.setPrompt([prompt])

  設置提示符,當你使用node運行該文件,而且調用rl.prompt()時,會在終端看到你設置的提示prompt,即「> 請輸入」函數

rl.setPrompt('> 請輸入')
複製代碼

注意:該方法和上面的實例參數配置是同樣的效果ui

二、rl.prompt([preserveCursor])

  爲用戶輸入準備好readline,將現有的setPrompt選項放到新的一行,讓用戶有一個新的地方開始輸入。將preserveCursor設爲true來防止光標位置被從新設定成0。   如須要換行輸入,即在新的一行,輸入信息,可在prompt中加入\n。spa

rl.prompt(); // 控制檯結果顯示:>請輸入
複製代碼
三、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'});
複製代碼
四、rl.question(query, callback)

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

rl.question('你今年多大了?\n', function(prompt) {
    console.log('這是你輸入的回答結果:' + prompt);
    rl.close();
  })
複製代碼
五、rl.pause()

  暫停readline的輸入流,能夠恢復,rl.resume()、rl.write()、rl.question()和rl.prompt()都可以恢復該輸入流。   調用該方法會觸發pause事件。htm

六、rl.resume()

  恢復readline的輸入流。   調用該方法會觸發resume事件。

七、rl.close()

  關閉readline建立的實例,不控制輸入輸出流。   調用該方法會觸發close事件。

事件

一、line事件

  不管什麼時候,在輸入流接收了一個行結束符(\n, \r, 或者 \r\n)時觸發,即在用戶輸入後,按了回車或者返回鍵時觸發該事件。能夠用來監聽用戶輸入。

rl.on('line', function (line) {
    console.log('這是用戶輸入的內容:' + line);
  })
複製代碼
二、pause事件

  輸入流被暫停時觸發,即調用了rl.pause(),或者沒有暫停輸入流,在收到 SIGCONT/SIGINT,且readline.Interfacce實例上並無註冊SIGCONT/SIGINT監聽器時,也會被觸發,而且若是輸入流在收到SIGTSIP以前就已經被暫停了,那麼該事件也不會觸發。

rl.on('pause', function() {
    console.log('暫停輸入流...')
  })
複製代碼
三、resume事件

  輸入流從新啓動時被觸發,即調用了rl.resume()、或者rl.write()、rl.question()和rl.prompt()。

rl.on('resume', function() {
    console.log('恢復輸入流...')
  })
複製代碼
四、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); // 退出當前進程
  })
複製代碼
五、SIGCOUT(該事件在window系統上不起做用)

  當使用-Z將Node.js進程移動到後臺時,SIGCONT事件將會被觸發。而後可使用 fg(1) 命令將它移動到前臺。   若是輸入流在收到SIGTSIP以前就已經被暫停了,那麼該事件就不會觸發。

六、SIGINT

  當輸入流收到-C命令時,咱們熟知的SIGINT事件就會被觸發。若是當時並無註冊任何SIGINT事件監聽器,那麼當輸入流接收到SIGINT信號時,’pause’事件和’close’事件均會被觸發。

七、SIGTSTP(該事件在window系統上不起做用)

  當輸入流收到-Z命令時,咱們熟知的SIGTSTP事件就會被觸發。若是沒有註冊SIGTSTP事件監聽器,那麼當輸入流收到SIGTSTP事件時,Node.js進程就將會被移動到後臺。   若是輸入在進程被髮送到後臺以前就已經被暫停了,那麼’pause’和’SIGCONT’事件就將不會被觸發。

參見官方文檔 參考案例看笑話readline

相關文章
相關標籤/搜索