Node.jsでCLIアプリケーションを作る際に、インタラクティブなプロンプトを出して、ユーザのテキスト入力を受け取る実装を紹介する。
この実装は3行で済み、外部ライブラリを必要としない。
デモ
こんな感じで、ターミナルにタイプした文字をNode.jsで受け取るものを実装する。
実装
上でのデモの完全な実装は次のコードになる:
function readText() {
process.stdin.resume()
return new Promise(r => process.stdin.once('data', r))
.finally(() => process.stdin.pause())
}
(async function main () {
process.stdout.write('> ')
process.stdout.write('< ' + await readText())
process.stdout.write('> ')
process.stdout.write('< ' + await readText())
})()
このうち、ユーザ入力を受け取るコアの部分は次の3行:
process.stdin.resume()
new Promise(r => process.stdin.once('data', r))
.finally(() => process.stdin.pause())
- 1行目の
resume
で標準入力の受付を再開する。- どこかの処理ですでに
pause
していた場合に再開しないと2行目が動かないため。
- どこかの処理ですでに
- 2行目で標準入力を1回だけ受け取る。
- 3行目の
pause
で標準入力の受け付けを停止する。- ずっと受け付けっぱなしなると、CLIのプロセスが終了しないため。