導入
Node.jsは、Google ChromeウェブブラウザでJavaScriptを実行するのと同じV8 JavaScriptエンジンを使用して、ブラウザ外でJavaScriptを実行できる人気のオープンソースランタイム環境です。Node.jsランタイムは、コマンドラインツールやウェブサーバーの作成によく使用されます。.
Node.jsを学習することで、フロントエンドとバックエンドのコードを同じ言語で記述できるようになります。スタック全体でJavaScriptを使用すると、コンテキストの切り替え時間を短縮でき、バックエンドサーバーとフロントエンドプロジェクト間でライブラリをより簡単に共有できるようになります。.
また、非同期実行をサポートしているため、Node.jsはI/O負荷の高いタスクに優れており、Webに最適です。ビデオストリーミングや、常にデータの送受信を行うアプリケーションなどのリアルタイムアプリケーションは、Node.jsで記述することでより効率的に実行できます。.
このチュートリアルでは、Node.jsランタイムを使って初めてのアプリケーションを作成します。Node.jsの具体的な概念を学び、ユーザーがシステムの環境変数を確認できるアプリケーションの作成手順を学びます。具体的には、コンソールに文字列を出力する方法、ユーザーからの入力を受け取る方法、環境変数にアクセスする方法を学びます。.
前提条件
このチュートリアルを完了するには、次のものが必要です。
- 開発マシンにNode.jsがインストールされています。このチュートリアルではNode.jsバージョン10.16.0を使用します。macOSまたはUbuntu 18.04にインストールするには、「macOSにNode.jsをインストールしてローカル開発環境を作成する方法」の手順、または「Ubuntu 18.04にNode.jsをインストールする方法」の「PPAを使用してインストールする」セクションの手順に従ってください。.
- 基本的な JavaScript の知識については、「JavaScript でコーディングする方法」をご覧ください。.
ステップ1 – コンソールへの出力
「Hello, world!」プログラムを書くには、nano などのコマンドライン テキスト エディターを開き、新しいファイルを作成します。
nano hello.jsテキスト エディターが開いたら、次のコードを入力します。
console.log("Hello World");Node.jsのコンソールオブジェクトは、stdout、stderr、またはその他のNode.jsストリーム(ほとんどの場合、コマンドライン)に書き込むためのシンプルなメソッドを提供します。logメソッドはstdoutストリームに出力するため、コンソールで確認できます。.
Node.jsの文脈において、ストリームとは、stdoutストリームのようにデータを受信できるオブジェクト、またはネットワークソケットやファイルのようにデータを出力できるオブジェクトを指します。stdoutストリームとstderrストリームの場合、送信されたデータはコンソールに表示されます。ストリームの重要な点の一つは、簡単にリダイレクトできることです。例えば、プログラムの出力をファイルにリダイレクトできます。.
CTRL+X を押して nano を保存して終了します。ファイルを保存するように求められたら、Y を押します。これでプログラムを実行する準備が整いました。.
ステップ2 – プログラムを実行する
このプログラムを実行するには、次のように node コマンドを使用します。
node hello.jshello.js プログラムが実行され、次の出力が表示されます。
Output
Hello WorldNode.jsインタープリタはファイルを読み取り、グローバルコンソールオブジェクトのlogメソッドを呼び出してconsole.log(“Hello World”)を実行しました。文字列“Hello World”はlog関数の引数として渡されました。.
引用符は、テキストが文字列であることを示すためにコード内で必要ですが、画面には印刷されません。.
プログラムが動作していることを確認したので、さらにインタラクティブにしてみましょう。.
ステップ3 – コマンドライン引数によるユーザー入力の取得
Node.jsの「Hello, World!」を実行するたびに、プログラムは同じ出力を生成します。プログラムをより動的にするために、ユーザーからの入力を取得して画面に表示してみましょう。.
コマンドラインツールは、多くの場合、動作を変更する様々な引数を受け取ります。例えば、nodeコマンドに--version引数を付けて実行すると、インタープリターを実行する代わりに、インストールされているバージョンが表示されます。これで、コマンドライン引数を介してコードが受け入れられたことになります。.
nano を使用して新しい arguments.js ファイルを作成します。
nano arguments.js次のコードを入力してください:
console.log(process.argv);
プロセスオブジェクトは、実行中のNode.jsプロセスに関連するすべての関数とデータを含むグローバルNode.jsオブジェクトです。argvプロパティは、プログラムに渡されるすべてのコマンドライン引数を含む文字列の配列です。.
CTRL+X と入力して nano を保存して終了し、ファイルを保存するように求められたら Y を押します。.
このプログラムを実行するときは、次のようなコマンドライン引数を指定します。
node arguments.js hello world出力は次のようになります。
Output
[ '/usr/bin/node',
'/home/sammy/first-program/arguments.js',
'hello',
'world' ]
process.argv 配列の最初の引数は常に、プログラムを実行しているNode.jsバイナリの場所です。2番目の引数は常に、実行中のファイルの場所です。残りの引数は、ユーザーが入力した値、つまりこの場合は「hello world」です。.
ここで注目すべきは、Node.jsが提供するデフォルトの引数ではなく、ユーザーが入力した引数です。arguments.jsファイルを開いて編集してみましょう。
nano arguments.jsconsole.log(process.arg); を次のように変更します。
console.log(process.argv.slice(2));argv は配列なので、JavaScript 組み込みの slice メソッドを使用して要素のコレクションを返すことができます。slice 関数に引数 2 を渡すと、argv の 2 番目の要素以降のすべての要素、つまりユーザーが入力した引数が取得されます。.
前回と同じ引数を使用して、node コマンドでプログラムを再度実行します。
node arguments.js hello world出力は次のようになります。
Output
[ 'hello', 'world' ]ユーザーからの入力を収集できるようになったので、アプリケーション環境からの入力を収集してみましょう。.
ステップ4 – 環境変数へのアクセス
環境変数は、アプリケーションの外部に保存され、オペレーティングシステムによって提供されるキーと値のペアを持つデータです。通常、システムまたはユーザーによって設定され、実行中のすべてのプロセスで設定や状態管理に利用できます。Node.jsのプロセスオブジェクトを使用してアクセスできます。.
nano を使用して新しい環境ファイルを作成します。.
nano environment.js次のコードを追加します。
console.log(process.env);env オブジェクトには、Node.js アプリケーションの実行時に使用できるすべての環境変数が格納されます。.
前と同じように保存して終了し、node コマンドで environment.js ファイルを実行します。.
node environment.jsプログラムを実行すると、次のような出力が表示されます。
Output
{ SHELL: '/bin/bash',
SESSION_MANAGER:
'local/digitalocean:@/tmp/.ICE-unix/1003,unix/digitalocean:/tmp/.ICE-unix/1003',
COLORTERM: 'truecolor',
SSH_AUTH_SOCK: '/run/user/1000/keyring/ssh',
XMODIFIERS: '@im=ibus',
DESKTOP_SESSION: 'ubuntu',
SSH_AGENT_PID: '1150',
PWD: '/home/sammy/first-program',
LOGNAME: 'sammy',
GPG_AGENT_INFO: '/run/user/1000/gnupg/S.gpg-agent:0:1',
GJS_DEBUG_TOPICS: 'JS ERROR;JS LOG',
WINDOWPATH: '2',
HOME: '/home/sammy',
USERNAME: 'sammy',
IM_CONFIG_PHASE: '2',
LANG: 'en_US.UTF-8',
VTE_VERSION: '5601',
CLUTTER_IM_MODULE: 'xim',
GJS_DEBUG_OUTPUT: 'stderr',
LESSCLOSE: '/usr/bin/lesspipe %s %s',
TERM: 'xterm-256color',
LESSOPEN: '| /usr/bin/lesspipe %s',
USER: 'sammy',
DISPLAY: ':0',
SHLVL: '1',
PATH:
'/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin',
DBUS_SESSION_BUS_ADDRESS: 'unix:path=/run/user/1000/bus',
_: '/usr/bin/node',
OLDPWD: '/home/sammy' }表示される環境変数の多くはシステム構成や設定に依存しており、出力はここで表示されているものとは大きく異なる場合があることにご注意ください。環境変数の長いリストを表示するよりも、特定の環境変数を取得したい場合もあるでしょう。.
ステップ5 – 特定の環境変数にアクセスする
この手順では、グローバル process.env オブジェクトを使用して環境変数とその値を表示し、その値をコンソールに出力します。.
process.env オブジェクトは、環境変数名とその値を文字列として格納するシンプルなマッピングです。JavaScript の他のオブジェクトと同様に、プロパティにアクセスするには、括弧で囲んだ名前を参照します。.
編集のために environment.js ファイルを開きます。
nano environment.jsconsole.log(process.env); を次のように変更します。
console.log(process.env["HOME"]);ファイルを保存して終了します。environment.js アプリケーションを実行します。
node environment.js出力は次のようになります。
Output /home/sammy
オブジェクト全体を印刷する代わりに、$HOME 環境変数の値を格納する process.env の HOME プロパティのみを印刷するようになりました。.
繰り返しになりますが、このコードの出力はシステム固有のため、ここで表示されるものとは異なる可能性があります。取得する環境変数を指定できるようになったので、ユーザーに表示したい変数を尋ねることで、アプリケーションを拡張できます。.
ステップ6 – ユーザー入力に応じて引数を取得する
次に、コマンドライン引数と環境変数を読み取る機能を使用して、環境変数の値を画面に出力するコマンドライン ツールを作成します。.
nano を使用して新しい echo.js ファイルを作成します。
nano echo.js次のコードを追加します。
const args = process.argv.slice(2);
console.log(process.env[args[0]]);echo.js の1行目は、ユーザーが指定したすべてのコマンドライン引数を args という定数変数に格納します。2行目は、args の最初の要素に格納されている環境変数を出力します。つまり、ユーザーが指定した最初のコマンドライン引数です。.
保存してnanoを終了し、次のようにプログラムを実行します。
node echo.js HOME出力は次のようになります。
Output
/home/sammyHOME 引数は args 配列に格納され、process.env オブジェクトを介して環境内でその値を見つけるために使用されました。.
これで、システム上の任意の環境変数の値にアクセスできるようになりました。確認するには、PWD、USER、PATH などの変数を確認してください。.
個々の変数を取得するのは問題ありませんが、ユーザーが必要な変数の数を指定できるようにする方がよいでしょう。.
ステップ7 – 複数の環境変数を表示する
現在、このプログラムは一度に1つの環境変数しかチェックできません。複数のコマンドライン引数を受け取り、それに対応する環境変数の値を取得できれば便利です。nanoコマンドを使ってecho.jsを編集してください。
nano echo.js代わりに次のコードが含まれるようにファイルを編集します。
const args = process.argv.slice(2);
args.forEach(arg => {
console.log(process.env[arg]);
});forEachメソッドは、すべての配列オブジェクトに適用される標準的なJavaScriptメソッドです。このメソッドは、配列の各要素を反復処理する際に使用されるコールバック関数を受け取ります。args配列に対してforEachを使用し、現在の引数の値を環境に出力するコールバック関数を指定します。.
ファイルを保存して終了します。次に、2つの引数を指定してプログラムを再度実行します。
node echo.js HOME PWD次の出力が表示されます。
[secondary_label Output]
/home/sammy
/home/sammy/first-programforEach 関数は、各コマンドライン引数が args 配列に出力されるようにします。.
これで、ユーザーが要求した変数を取得する方法はできましたが、ユーザーが不正なデータを入力した場合の処理もまだ必要です。.
ステップ8 – 未指定の入力の処理
有効な環境変数ではない引数をプログラムに与えた場合に何が起こるかを確認するには、次を実行します。
node echo.js HOME PWD NOT_DEFINED出力は次の図のようになります。
[secondary_label Output]
/home/sammy
/home/sammy/first-program
undefined最初の2行は期待通りに出力されていますが、最後の行は単に undefined です。JavaScriptでは、undefined 値とは、変数またはプロパティに値が割り当てられていないことを意味します。NOT_DEFINED は有効な環境変数ではないため、undefined と表示されます。.
ユーザーのコマンドライン引数が環境内で見つからない場合は、ユーザーにエラーメッセージを表示する方が便利です。.
echo.js を開いて編集します。
nano echo.jsecho.js を編集して、次のコードを追加します。
const args = process.argv.slice(2);
args.forEach(arg => {
let envVar = process.env[arg];
if (envVar === undefined) {
console.error(`Could not find "${arg}" in environment`);
} else {
console.log(envVar);
}
});ここでは、forEach に提供されているコールバック関数を次の操作を実行するように変更しました。
- 環境内のコマンドライン引数の値を取得し、env Var 変数に保存します。.
- envVar 値が未定義かどうかを確認します。.
- envVar が定義されていない場合は、見つからなかったことを示す役立つメッセージを出力します。.
- 環境変数が見つかった場合は、その値を出力します。.
ここでもう一度次のコマンドを実行します。
node echo.js HOME PWD NOT_DEFINED今回の出力は次のようになります。
[secondary_label Output]
/home/sammy
/home/sammy/first-program
Could not find "NOT_DEFINED" in environment環境変数ではないコマンドライン引数を指定すると、そのことを伝える明確なエラー メッセージが表示されます。.
結果
最初のプログラムでは画面に「Hello World」を表示し、今度はユーザー引数を読み取って環境変数を表示する Node.js コマンドライン ツールを作成しました。.
さらに発展させたい場合は、このプログラムの動作をさらに変更することができます。例えば、出力前にコマンドライン引数を検証したい場合などです。引数が未定義の場合はエラーを返し、すべての引数が有効な環境変数である場合にのみ、ユーザーに出力が表示されます。.









