Skip to content

Node.jsでコマンドラインから入力を受け取る

Node.jsのCLIプログラムを対話型にするには?

Node.js 7以降では、readlineモジュールを使用して、process.stdinストリームなどの読み取り可能なストリーム(Node.jsプログラムの実行中はターミナル入力)から一度に一行ずつ入力を受け取ることができます。

javascript
const readline = require('node:readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
rl.question("What's your name?", name => {
    console.log('Hi ' + name + '!');
    rl.close();
});

このコードはユーザーの名前を尋ね、テキストが入力されユーザーがEnterキーを押すと、挨拶を送信します。

question()メソッドは最初の引数(質問)を表示し、ユーザー入力を待ちます。Enterキーが押されるとコールバック関数を呼び出します。

このコールバック関数では、readlineインターフェースを閉じます。

readlineは他にも多くのメソッドを提供しています。上記のリンク先のライブラリドキュメントを参照してください。

パスワードを要求する必要がある場合は、パスワードをエコーバックせず、代わりに*記号を表示するのが最適です。

最も簡単な方法は、readline-syncパッケージを使用することです。これはAPIに関して非常に似ており、この機能をすぐに利用できます。より完全で抽象的なソリューションは、Inquirer.jsパッケージによって提供されています。

npm install inquirerを使用してインストールできます。そして、上記のコードを次のように複製できます。

javascript
const inquirer = require('inquirer');
const questions = [
    {
        type: 'input',
        name: 'name',
        message: "what's your name?"
    }
];
inquirer.prompt(questions).then(answers => {
    console.log('Hi ' + answers.name + '!');
});

Inquirer.jsを使用すると、複数選択肢の質問、ラジオボタン、確認など、多くのことができます。

Node.jsによって提供されるビルトインの選択肢をすべて知っておく価値はありますが、CLI入力を次のレベルに引き上げようとする場合は、Inquirer.jsが最適な選択肢です。