過去ネタ供養 5:Node.js CLI でユーザ入力を待機するコード片

メリークリスマス。過去ネタ供養の最終回。

僕は CLI ツールを作る時、「本当に実行しますか?」とか「ファイル名を入力してください」みたいな、ユーザ入力を求めるプロンプトを作るのが好きだ。いきなり全てが実行されてしまうと、ミスった時に戻すのが辛いので、実行前に確認を入れてもらえると良いなという理由である。

過去に Windows コマンドプロンプトと Bash でそうした「実行前確認」処理を作るためのイディオムは紹介したが、今回は Node.js スクリプトで実現する方法。

/**
 * ユーザ入力を受け付ける
 * 
 * @return {string} ユーザが入力した文字列 (改行を削除するため `trim()` してある)
 */
const readText = () => {
  process.stdin.resume();
  return new Promise(resolve => process.stdin.once('data', resolve)).finally(() => process.stdin.pause()).then(text => text.toString().trim());
};

// 使い方例
(async () => {
  // この文字列に続いて、改行なしでユーザ入力の文字列を出力させたい場合は `console.log` ではなく `process.stdout.write` を使うと改行が入らない
  process.stdout.write('Pause > ');
  
  // await で待つ
  const answer = await readText();
  
  // 受け取った値に応じて処理をハンドリングする
  if(answer !== 'y') return console.log('Aborted');
  
  console.log('Answer : ', answer);
})();

参考にしたのは以下の記事。コレを元に trim() などを自分で付け足している。

このイディオムはよく使っている。


今年のクリスマスイブは、我が子のとある記念日。離婚して我が子と離れて暮らしているので、直接祝ったり、クリスマスを一緒に過ごしたりできず、本当に寂しい。「父親」をしたいのに父親をすることもできず、仕事では炎上案件で疲弊し、プライベートでは何も出来ない。寂しいクリスマスである。