ノード.JI CLI入力
このチュートリアルでは、ノードでユーザー入力を取得する方法を学びます.JS CLIアプリケーション.これを行うには、あなたが聞く必要があります
ストリームはI/Oに対処するために使用されますdocumentation .
必要条件 JavaScript言語を理解する必要があります. あなたはNode.js お使いのコンピュータにインストールされます.
概要 Project Setup Readline Package Callback Hell Async Iterator Readline Sync Package Recap
プロジェクト設定
始めるために、プロジェクトを立ち上げましょう.
新しいディレクトリを作成する
ディレクトリ内で実行します.
完了したら、新しいファイルを作成します
readlineパッケージ
The
インポートしましょう
The string :この文字列をユーザに質問として表示します. コールバック関数
例えば、
コールバック地獄
との問題
複数のユーザ入力を順番に取得したい場合は、以下のようにコールバック関数内で行います.
async iterator
非同期の反復処理を使用すると、非同期に来るデータについての反復処理を行うことができます.入力ストリームの各行を反復処理する非同期イテレータを作成できます.
asyncイテレータについてもっと知りたい場合はarticle .
私たちはSymbol.asyncIterator の
readline sync package
外部パッケージをインストールすることを気にしないなら、あなたが構築しているCLIアプリケーションのバンドルサイズを増やすでしょう
インストールしましょう
と違って
The
再生しましょう 我々は readlineストリームのイベントリスナーを追加しました async iteratorを使ってコールバックの地獄を防ぐためにユーザからの入力を取得するために、async関数を書きました. 我々は おめでとう.🥳 あなたはそれをした.
読書ありがとう!
STDIN
(標準入力)ノード.JS露出process.stdin
, 読み込み可能なストリーム.ストリームはI/Oに対処するために使用されますdocumentation .
必要条件
概要
プロジェクト設定
始めるために、プロジェクトを立ち上げましょう.
新しいディレクトリを作成する
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つの引数をとります: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.asyncIterator の
readline
オブジェクトは、入力ストリームの次の値を取得します.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
ユーザからの入力を促すパッケージ.close
イベント.readline-sync
ユーザからの入力を同期的に入力するパッケージ.読書ありがとう!
Reference
この問題について(ノード.JI CLI入力), 我々は、より多くの情報をここで見つけました https://dev.to/zolomohan/node-js-cli-input-4fp6テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol