過去ネタ供養 5 : Node.js CLI でユーザ入力を待機するコード片
メリークリスマス。過去ネタ供養の最終回。
僕は CLI ツールを作る時、「本当に実行しますか?」とか「ファイル名を入力してください」みたいな、ユーザ入力を求めるプロンプトを作るのが好きだ。いきなり全てが実行されてしまうと、ミスった時に戻すのが辛いので、実行前に確認を入れてもらえると良いなという理由である。
- 過去記事 : Bash でコマンド実行前に確認するイディオムおさらい
過去に 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()
などを自分で付け足している。
このイディオムはよく使っている。
今年のクリスマスイブは、我が子のとある記念日。離婚して我が子と離れて暮らしているので、直接祝ったり、クリスマスを一緒に過ごしたりできず、本当に寂しい。「父親」をしたいのに父親をすることもできず、仕事では炎上案件で疲弊し、プライベートでは何も出来ない。寂しいクリスマスである。