While programming with JavaScript, I ran into an issue you wouldn't expect to run into. JavaScript is a very powerful language, but have you ever really seen a JavaScript code that reads input from the console?
Reading console inputs in JavaScript doesn't happen the same way it happens in most programming languages. So I'll show you how to do it in this article.
To read inputs from the console, you'll need the readline library. This library is built into JavaScript. So there's no need for extra installations.
With that said, let's begin. There are two main ways of reading inputs and they both use different libraries. I'll cover using the readline library and using the readline-sync library.
With readline
Step 1: Import the readline library
const readline = require('readline');
Step 2: Create an interface
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
In creating the interface, we set it to receive inputs from the standard input and push its output to the standard output. The standard input and output is the console.
Step 3: Create a prompt
rl.question('What is your name? ', ans => {
console.log('Your name is', ans);
rl.close();
});
The function rl.question above, displays "What is your name? " in the terminal, and waits for the user to respond before passing the user's response to the callback function.
You need to close the interface using the rl.close() at the end of the input or else the entire program won’t quit.
With readline-sync
readline-sync does the same thing as readline except that readline-sync allows you to read inputs synchronously.
To read console inputs with readline-sync follow these steps:
Step 1: Install the library
npm i readline-sync
Step 2: Import the readline-sync library
const rl = require('readline-sync');
Step 3: Create the prompt
const name = rl.question('What is your name? ');
console.log('Your name is', name);
Unlike with readline-sync, you don't need to close the interface. This is because you're not creating one in the first place. The rl.question function above, blocks the thread while waiting for the user to respond, and returns the response.
Bonus: Reading a key-press
By "reading a key-press" I mean that you're prompting your users to press a button without needing to press the Enter key. We can achieve this with both the readline and readline-sync library.
Let's look into how to read a key-press with both libraries.
With readline
To read key presses with the readline library, follow these steps:
Step 1: Import the readline library
const readline = require('readline');
Step 2: Prepare the standard input
readline.emitKeypressEvents(process.stdin);
process.stdin.setRawMode(true);
To prepare the standard input, we first set the readline library to emit key-press events to the standard input. Then we set the standard input to raw mode.
Step 3: Write your key-press event listener
process.stdin.on('keypress', (character) => {
console.log(character);
if (character === "k") {
process.stdin.destroy();
}
});
You need to call process.stdin.destroy before your code terminates, or else your code will continue running without stopping. process.stdin.destroy tells the code to stop waiting for inputs from the standard input.
With readline-sync
Reading a single key hit using the readline-sync module is very simple. So let's head straight to it
Step 1: Install the readline-sync library
npm i readline-sync
Step 2: Import the readline-sync library
const rl = require('readline-sync');
Step 3: Read a key press with rl.keyIn()
const key = rl.keyIn();
console.log(key);
Conclusion
Console inputs are one of the most rarely talked about concepts in JavaScript. So it's common to find people that don't know how to handle them yet.
I discovered that not many people knew about it (even me) when I tried using JavaScript to solve a programming exercise.
Thanks for reading!

Top comments (0)