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
を使用することで処理の流れが見やすくなるメリットがあります。
コメントを残す