穩(wěn)定性: 2 - 不穩(wěn)定
使用 require('readline'),可以使用這個(gè)模塊。逐行讀取(Readline)可以逐行讀取流(比如process.stdin)
一旦你開(kāi)啟了這個(gè)模塊,node 程序?qū)⒉粫?huì)終止,直到你關(guān)閉接口。以下的代碼展示了如何優(yōu)雅的退出程序:
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question("What do you think of node.js? ", function(answer) {
// TODO: Log the answer in a database
console.log("Thank you for your valuable feedback:", answer);
rl.close();
});
創(chuàng)建一個(gè)逐行讀?。≧eadline) Interface 實(shí)例. 參數(shù) "options" 對(duì)象有以下值:
input - 監(jiān)聽(tīng)的可讀流 (必填).
output - 逐行讀?。≧eadline)數(shù)據(jù)要寫(xiě)入的可寫(xiě)流(可選).
completer - 用于 Tab 自動(dòng)補(bǔ)全的可選函數(shù)。參見(jiàn)下面的例子。
terminal - 如果希望和 TTY 一樣,對(duì)待 input 和 output 流,設(shè)置為 true。 并且由 ANSI/VT100 轉(zhuǎn)碼。默認(rèn)情況下,檢查 isTTY 是否在 output 流上實(shí)例化。completer 給出當(dāng)前行的入口,應(yīng)該返回包含2條記錄的數(shù)組
一個(gè)匹配當(dāng)前輸入補(bǔ)全的字符串?dāng)?shù)組
最終像這樣:[[substr1, substr2, ...], originalsubstring].
例子:
function completer(line) {
var completions = '.help .error .exit .quit .q'.split(' ')
var hits = completions.filter(function(c) { return c.indexOf(line) == 0 })
// show all completions if none found
return [hits.length ? hits : completions, line]
}
同時(shí), completer 可以異步運(yùn)行,此時(shí)接收到2個(gè)參數(shù):
function completer(linePartial, callback) {
callback(null, [['123'], linePartial]);
}
為了接受用戶輸入,createInterface 通常和 process.stdin ,process.stdout一起使用:
var readline = require('readline');
var rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
如果你有逐行讀取(Readline)實(shí)例, 通常會(huì)監(jiān)聽(tīng)"line" 事件.
如果這個(gè)實(shí)例參數(shù) terminal = true,而且定義了 output.columns 屬性,那么 output 流將會(huì)最佳兼容性,并且,當(dāng) columns 變化時(shí)(當(dāng)它是 TTY 時(shí),process.stdout 會(huì)自動(dòng)這么做),會(huì)在 output 流上觸發(fā) "resize" 事件。
代表一個(gè)包含輸入/輸出流的逐行讀取(Readline)接口的類(lèi),
設(shè)置提示符,比如當(dāng)你再命令行里運(yùn)行 node 時(shí),可以看到 node 的提示符 >。
為用戶輸入準(zhǔn)備好逐行讀?。≧eadline),將當(dāng)前 setPrompt 選項(xiàng)方法哦新的行中,讓用戶有新的地方輸入。設(shè)置 preserveCursor 為 true,防止當(dāng)前的游標(biāo)重置為 0。
如果暫停,使用 createInterface也可以重置input 輸入流。
調(diào)用 createInterface 時(shí),如果 output 設(shè)置為 null 或 undefined ,不會(huì)重新寫(xiě)提示符。
預(yù)先提示 query,用戶應(yīng)答后觸發(fā) callback。給用戶顯示 query 后,用戶應(yīng)答被輸入后,調(diào)用 callback。
如果暫停,使用 createInterface也可以重置input 輸入流。
調(diào)用 createInterface 時(shí),如果 output 設(shè)置為 null 或 undefined ,不會(huì)重新寫(xiě)提示符。
例子:
interface.question('What is your favorite food?', function(answer) {
console.log('Oh, so your favorite food is ' + answer);
});
暫停逐行讀?。≧eadline)的 input 輸入流, 如果需要可以重新啟動(dòng)。
注意,這不會(huì)立即暫停流。調(diào)用 pause 后還會(huì)有很多事件觸發(fā),包含 line。
恢復(fù) 逐行讀?。≧eadline) input 輸入流.
關(guān)閉 Interface 實(shí)例, 放棄控制輸入輸出流。會(huì)觸發(fā)"close" 事件。
調(diào)用createInterface 后,將數(shù)據(jù) data 寫(xiě)到 output 輸出流,除非 output 為 null,或未定義undefined 。key 是一個(gè)代表鍵序列的對(duì)象;當(dāng)終端是一個(gè) TTY 時(shí)可用。
暫停 input 輸入流后,這個(gè)方法可以恢復(fù)。
例子:
rl.write('Delete me!');
// Simulate ctrl+u to delete the line written previously
rl.write(null, {ctrl: true, name: 'u'});
function (line) {}
input 輸入流收到 \n 后觸發(fā),通常因?yàn)橛脩羟没剀?chē)或返回鍵。這是監(jiān)聽(tīng)用戶輸入的好辦法。
監(jiān)聽(tīng) line 的例子:
rl.on('line', function (cmd) {
console.log('You just typed: '+cmd);
});
function () {}
暫停 input 輸入流后,會(huì)觸發(fā)這個(gè)方法。
當(dāng)輸入流未被暫停,但收到 SIGCONT 也會(huì)觸發(fā)。 (詳見(jiàn) SIGTSTP 和 SIGCONT 事件)
監(jiān)聽(tīng) pause 的例子:
rl.on('pause', function() {
console.log('Readline paused.');
});
function () {}
恢復(fù) input 輸入流后,會(huì)觸發(fā)這個(gè)方法。
監(jiān)聽(tīng) resume 的例子:
rl.on('resume', function() {
console.log('Readline resumed.');
});
function () {}
調(diào)用 close() 方法時(shí)會(huì)觸發(fā)。
當(dāng) input 輸入流收到 "end" 事件時(shí)會(huì)觸發(fā)。一旦觸發(fā),可以認(rèn)為 Interface 實(shí)例結(jié)束。例如當(dāng)input 輸入流收到 ^D,被當(dāng)做 EOT。
如果沒(méi)有SIGINT 事件監(jiān)聽(tīng)器,當(dāng)input 輸入流接收到^C(被當(dāng)做SIGINT),也會(huì)觸發(fā)這個(gè)事件。
function () {}
當(dāng) input 輸入流收到 ^C 時(shí)會(huì)觸發(fā), 被當(dāng)做SIGINT。如果沒(méi)有SIGINT 事件監(jiān)聽(tīng)器,當(dāng)input 輸入流接收到 SIGINT(被當(dāng)做SIGINT),會(huì)觸發(fā) pause 事件。
監(jiān)聽(tīng) SIGINT 的例子:
rl.on('SIGINT', function() {
rl.question('Are you sure you want to exit?', function(answer) {
if (answer.match(/^y(es)?$/i)) rl.pause();
});
});
function () {}
Windows 里不可用
當(dāng) input 輸入流收到 ^Z 時(shí)會(huì)觸發(fā),被當(dāng)做SIGTSTP。如果沒(méi)有SIGINT 事件監(jiān)聽(tīng)器,當(dāng)input 輸入流接收到 SIGTSTP,程序?qū)?huì)切換到后臺(tái)。
當(dāng)程序通過(guò) fg 恢復(fù),將會(huì)觸發(fā) pause 和 SIGCONT 事件。你可以使用兩者中任一事件來(lái)恢復(fù)流。
程切換到后臺(tái)前,如果暫停了流,pause 和 SIGCONT 事件不會(huì)被觸發(fā)。
監(jiān)聽(tīng) SIGTSTP 的例子:
rl.on('SIGTSTP', function() {
// This will override SIGTSTP and prevent the program from going to the
// background.
console.log('Caught SIGTSTP.');
});
function () {}
Windows 里不可用
一旦 input 流中含有 ^Z并被切換到后臺(tái)就會(huì)觸發(fā)。被當(dāng)做SIGTSTP,然后繼續(xù)執(zhí)行 fg(1)。程切換到后臺(tái)前,如果流沒(méi)被暫停,這個(gè)事件可以被觸發(fā)。
監(jiān)聽(tīng) SIGCONT 的例子:
rl.on('SIGCONT', function() {
// `prompt` will automatically resume the stream
rl.prompt();
});
以下的例子,展示了如何所有這些方法的命令行接口:
var readline = require('readline'),
rl = readline.createInterface(process.stdin, process.stdout);
rl.setPrompt('OHAI> ');
rl.prompt();
rl.on('line', function(line) {
switch(line.trim()) {
case 'hello':
console.log('world!');
break;
default:
console.log('Say what? I might have heard `' + line.trim() + '`');
break;
}
rl.prompt();
}).on('close', function() {
console.log('Have a great day!');
process.exit(0);
});
在TTY 流里,移動(dòng)光標(biāo)到指定位置。
在TTY 流里,移動(dòng)光標(biāo)到當(dāng)前位置的相對(duì)位置。
清空 TTY 流里指定方向的行。dir 是以下值:
-1 - 從光標(biāo)到左邊1 - 從光標(biāo)到右邊0 - 整行清空屏幕上從當(dāng)前光標(biāo)位置起的內(nèi)容。