Node.jsメモ: キーボードからの入力を取得する (readline.question)

キーボード(標準入力)からのユーザ入力を取得するには、readline 標準モジュールを使用します。 特に、readline.question() 関数を使用することで、ユーザへのプロンプトメッセージ表示と、ユーザ入力の取得を同時に行うことができます。

非同期でキーボード入力を取得する

下記の例では、プロンプトでユーザ名の入力を促し、入力された名前を使って挨拶文を表示します。

sample.js
import readline from 'node:readline';

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.question('What is your name? ', (answer) => {
  console.log(`Hello, ${answer}!`);
  rl.close();
});
実行例
$ node sample.js
What is your name? Maku
Hello, Maku!

同期でキーボード入力を取得する

readline モジュールは基本的に非同期に結果を受け取るように設計されているため、同期的にユーザ入力を取得したい場合は、Promise を使用した処理が必要になります。 下記の例では、ECMAScript 2017 の asyncawait を利用して同期的にキーボードからの入力を取得しています。

sample.js
import readline from 'node:readline';

// ユーザからのキーボード入力を取得する Promise を生成する
function readUserInput(question) {
  const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
  });

  return new Promise((resolve, reject) => {
    rl.question(question, (answer) => {
      resolve(answer);
      rl.close();
    });
  });
}

// メイン処理
(async function main() {
  const name = await readUserInput('What is your name? ');
  console.log(`Hello, ${name}!`);
})();
実行例
$ node sample.js
What is your name? Maku
Hello, Maku!