ノード.JI CLI入力


このチュートリアルでは、ノードでユーザー入力を取得する方法を学びます.JS CLIアプリケーション.これを行うには、あなたが聞く必要がありますSTDIN (標準入力)ノード.JS露出process.stdin , 読み込み可能なストリーム.
ストリームはI/Oに対処するために使用されますdocumentation .

必要条件
  • JavaScript言語を理解する必要があります.
  • あなたはNode.js お使いのコンピュータにインストールされます.

  • 概要
  • Project Setup
  • Readline Package
  • Callback Hell
  • Async Iterator
  • Readline Sync Package
  • Recap

  • プロジェクト設定
    始めるために、プロジェクトを立ち上げましょう.
    新しいディレクトリを作成するnode-cli-input .
    ディレクトリ内で実行します.
    npm init -y
    
    これはpackage.json ファイル.
    完了したら、新しいファイルを作成しますindex.js コードを書くには

    readlineパッケージ
    The readline パッケージは組み込みのパッケージです.jsreadline は標準I/Oのまわりのラッパです.
    インポートしましょうreadline 我々のパッケージindex.js ファイル.
    const readline = require('readline');
    
    私たちは新しいreadline インタフェースオブジェクトreadline.createInterface() 読み込み可能で書き込み可能なストリームを設定し、設定します.入出力ストリームを設定しましょうprocess.stdin and process.stdout それぞれ.
    const rl = readline.createInterface({
      input: process.stdin,
      output: process.stdout
    });
    
    我々は、ユーザーを使用して質問をすることができますrl.question() メソッド.
    The rl.question() メソッドは2つの引数をとります:
  • string :この文字列をユーザに質問として表示します.
  • コールバック関数rl.question() ユーザーが入力を行うまで、メソッドが待機します.ユーザが入力を行うと、このコールバック関数が実行されます.コールバック関数は引数としてユーザの入力を取得します.
  • NOTE: We should close the streams using the rl.close() method inside the callback function. If not closed, the process will remain in an idle state.


    例えば、
    rl.question("Your favorite color? ", (input) => {
      console.log(input);
      rl.close();
    });
    
    出力:
    Your favorite color? Black
    Black
    
    イベントリスナーを追加できますclose を使用したストリームイベントrl.on() メソッド.
    rl.on('close', () => {
      console.log('Streams Closed')
    })
    
    出力:
    Your favorite color? Black
    Black
    Streams Closed
    
    あなたはもっと学ぶことができますreadline パッケージからdocumentation .

    コールバック地獄
    との問題rl.question() 方法はaを返しませんPromise . したがって、我々は使用できませんasync/await ユーザーが入力を提供するまでプログラムの流れを一時停止します.
    複数のユーザ入力を順番に取得したい場合は、以下のようにコールバック関数内で行います.
    rl.question("Question 1? ", (answer1) => {
      // do stuff
    
      rl.question("Question 2? ", (answer2) => {
        // do stuff
    
        rl.question("Question 3? ", (answer3) => {
          // do stuff
    
          rl.question("Question 4? ", (answer4) => {
            console.log(answer1, answer2, answer3, answer4);
            rl.close();
          });
        });
      });
    });
    
    あなたが見ることができるように、これはすぐにコントロールから取得することができますし、コードを管理するのは難しいでしょう.

    async iterator
    非同期の反復処理を使用すると、非同期に来るデータについての反復処理を行うことができます.入力ストリームの各行を反復処理する非同期イテレータを作成できます.
    asyncイテレータについてもっと知りたい場合はarticle .
    for await (const line of rl) {
      // Each line in from the input stream will be available successively here as `line`.
    }
    
    我々は、使用できませんawait キーワード外部async 関数.したがって、我々はすべてのコードをasync関数の中に包む必要があります.
    async function main() {
      // do your stuff here
    
      for await (const line of rl) {
        // Each line in from the input stream will be available here as `line`.
      }
    }
    
    main();
    
    新しい関数を作成しましょうinput() を入力して入力を取得します.
    私たちはSymbol.asyncIteratorreadline オブジェクトは、入力ストリームの次の値を取得します.
    async function input(prompt) {
      console.log(prompt);
      return (await rl[Symbol.asyncIterator]().next()).value;
    }
    
    さて、この関数を使用して入力ストリームから値を取得し、await キーワードは、ユーザーから入力を取得するまで実行を一時停止します.
    async function main() {
      const name = await input("May I have your name? ");
      const color = await input("Your favorite color? ");
    
      console.log(name, color);
      rl.close();
    }
    
    main();
    

    readline sync package
    外部パッケージをインストールすることを気にしないなら、あなたが構築しているCLIアプリケーションのバンドルサイズを増やすでしょうreadline-sync パッケージは、同期的にユーザーからの入力を取得します.
    インストールしましょうreadline-sync 走ること
    npm install readline-sync
    
    さて、パッケージをインポートしましょう.
    const readlineSync = require("readline-sync");
    
    このreadline パッケージは、readlineSync.question() ユーザに入力を促す方法.
    と違ってreadline パッケージの場合、この関数にコールバック関数を渡す必要はありません.The readlineSync.question() メソッドはユーザの入力を返します.
    let input = readlineSync.question('May I have your name? ');
    console.log(`Hi ${input}!`);
    
    The readlineSync パッケージには、次のような他の機能がありますreadlineSync.keyInYN() , readlineSync.keyInSelect() , など
    The readlineSync.keyInYN() は、Enterキーを押すことなく、単一のキーからユーザーの応答を得るために使用されます.この関数はtrue yを押すとfalse 他の何かが押されるならば.
    if (readlineSync.keyInYN('Yes?')) {
      // 'Y' key was pressed.
    } else {
      // Another key was pressed.
    }
    
    The readlineSync.keyInSelect() ユーザーがリストから項目を選択するよう促します.この関数はユーザが選択した番号を返します.ユーザーは、この関数を使用してEnterボタンを押す必要はありません.
    let colors = ['Black', 'White', 'Gray', 'Yellow', 'Blue'];
    
    let index = readlineSync.keyInSelect(colors, 'Favorite Color?');
    console.log(colors[index]);
    
    出力:
    [1] Black
    [2] White
    [3] Gray
    [4] Yellow
    [5] Blue
    [0] CANCEL
    
    Favorite Color? [1...5 / 0]: 2
    White
    
    あなたはもっと学ぶことができますreadline-sync パッケージとそれから利用できる他のメソッドnpm page .

    再生しましょう
  • 我々はreadline ユーザからの入力を促すパッケージ.
  • readlineストリームのイベントリスナーを追加しましたclose イベント.
  • async iteratorを使ってコールバックの地獄を防ぐためにユーザからの入力を取得するために、async関数を書きました.
  • 我々はreadline-sync ユーザからの入力を同期的に入力するパッケージ.
  • おめでとう.🥳 あなたはそれをした.
    読書ありがとう!