Node.jsで標準入力を扱う方法、コールバックとPromiseの比較

node.jsをCLI実行した際、対話して条件分岐させたい場合に必要になる標準入力を受け取る方法です。

まずは失敗例としては以下があると思います。これはブラウザ実行するJavaScriptでは機能しますがnode.jsでは実行できません。

// ブラウザJSのみで実行できて、node.jsでは実行できない例

if (confirm("本日は快晴ですか?"))
{
console.log("晴れのようでなによりです");
} else {
console.log("晴れてなくても良い日になりますように");
}

node.jsではconfirmメソッドは実装されておらず、readlineモジュールを使用することが一般的です。以下は、標準入力を受け取る基本的な例です。

標準入力を受け取る例

実際に動くサンプルがこちら

const readline = require('readline');

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

rl.question('何か入力してください: ', (answer) => {
  console.log(`入力された内容: ${answer}`);
  
  // インターフェースを閉じる
  rl.close();
});

実行結果

$ node sample.js 
何か入力してください: test
入力された内容: test
$

これで標準入力を受け取る事ができるので、条件分岐を記述していく事が可能になります。

rl.question()メソッドにコールバック関数を渡したり、rl.close()メソッドで インターフェースを閉じる必要があります。

発展系のPromise版

コールバック関数を使いたくない場合にはこちらのPromise版を使う事ができます。

const readline = require('readline');

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

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

(async () => {
  const userInput = await questionAsync('何か入力してください: ');
  console.log(`入力された内容: ${userInput}`);
})();

awaitを使用することで処理の流れが見やすくなるメリットがあります。

投稿者


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA