5.7 KiB
Readline
Stability: 3 - Stable
To use this module, do require('readline')
. Readline allows reading of a
stream (such as STDIN) on a line-by-line basis.
Note that once you've invoked this module, your node program will not terminate until you've paused the interface. Here's how to allow your program to gracefully pause:
var rl = require('readline');
var i = rl.createInterface(process.stdin, process.stdout, null);
i.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.");
i.pause();
});
rl.createInterface(input, output, completer)
Takes two streams and creates a readline interface. The completer
function
is used for autocompletion. When given a substring, it returns [[substr1, substr2, ...], originalsubstring]
.
Also completer
can be run in async mode if it accepts two arguments:
function completer(linePartial, callback) { callback(null, [['123'], linePartial]); }
createInterface
is commonly used with process.stdin
and
process.stdout
in order to accept user input:
var readline = require('readline'),
rl = readline.createInterface(process.stdin, process.stdout);
Class: Interface
The class that represents a readline interface with a stdin and stdout stream.
rl.setPrompt(prompt, length)
Sets the prompt, for example when you run node
on the command line, you see
>
, which is node's prompt.
rl.prompt()
Readies readline for input from the user, putting the current setPrompt
options on a new line, giving the user a new spot to write.
This will also resume the in
stream used with createInterface
if it has
been paused.
rl.question(query, callback)
Prepends the prompt with query
and invokes callback
with the user's
response. Displays the query to the user, and then invokes callback
with the
user's response after it has been typed.
This will also resume the in
stream used with createInterface
if it has
been paused.
Example usage:
interface.question('What is your favorite food?', function(answer) {
console.log('Oh, so your favorite food is ' + answer);
});
rl.pause()
Pauses the readline in
stream, allowing it to be resumed later if needed.
rl.resume()
Resumes the readline in
stream.
rl.write()
Writes to tty.
This will also resume the in
stream used with createInterface
if it has
been paused.
Event: 'line'
function (line) {}
Emitted whenever the in
stream receives a \n
, usually received when the
user hits enter, or return. This is a good hook to listen for user input.
Example of listening for line
:
rl.on('line', function (cmd) {
console.log('You just typed: '+cmd);
});
Event: 'pause'
function () {}
Emitted whenever the in
stream is paused or receives ^D
, respectively known
as EOT
. This event is also called if there is no SIGINT
event listener
present when the in
stream receives a ^C
, respectively known as SIGINT
.
Also emitted whenever the in
stream is not paused and receives the SIGCONT
event. (See events SIGTSTP
and SIGCONT
)
Example of listening for pause
:
rl.on('pause', function() {
console.log('Readline paused.');
});
Event: 'resume'
function () {}
Emitted whenever the in
stream is resumed.
Example of listening for resume
:
rl.on('resume', function() {
console.log('Readline resumed.');
});
Event: 'SIGINT'
function () {}
Emitted whenever the in
stream receives a ^C
, respectively known as
SIGINT
. If there is no SIGINT
event listener present when the in
stream
receives a SIGINT
, pause
will be triggered.
Example of listening for SIGINT
:
rl.on('SIGINT', function() {
rl.question('Are you sure you want to exit?', function(answer) {
if (answer.match(/^y(es)?$/i)) rl.pause();
});
});
Event: 'SIGTSTP'
function () {}
This does not work on Windows.
Emitted whenever the in
stream receives a ^Z
, respectively known as
SIGTSTP
. If there is no SIGTSTP
event listener present when the in
stream
receives a SIGTSTP
, the program will be sent to the background.
When the program is resumed with fg
, the pause
and SIGCONT
events will be
emitted. You can use either to resume the stream.
The pause
and SIGCONT
events will not be triggered if the stream was paused
before the program was sent to the background.
Example of listening for SIGTSTP
:
rl.on('SIGTSTP', function() {
// This will override SIGTSTP and prevent the program from going to the
// background.
console.log('Caught SIGTSTP.');
});
Event: 'SIGCONT'
function () {}
This does not work on Windows.
Emitted whenever the in
stream is sent to the background with ^Z
,
respectively known as SIGTSTP
, and then continued with fg
. This event only
emits if the stream was not paused before sending the program to the
background.
Example of listening for SIGCONT
:
rl.on('SIGCONT', function() {
// `prompt` will automatically resume the stream
rl.prompt();
});
Here's an example of how to use all these together to craft a tiny command line interface:
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('pause', function() {
console.log('Have a great day!');
process.exit(0);
});