ファイル名を指定しての実行
次にスクリプトをファイルに保存して実行してみます(図2)。通常は、このような形で利用することのほうが多いでしょう。
実行したスクリプトはリスト2です。日本語を含む場合は、文字コードをUTF-8にして保存してください。Shift JISなどはサポートされていません。
// (1)フォーマット 指定することも可能 console.log('こんにちは世界'); var j = { name : 'foo' , age : 29 }; console.log('%s %d %j', j.name, j.age, j); // (2)スクリプトのファイル名、フォルダ console.log(__dirname); console.log(__filename); // (3)コマンドライン引数 process.argv.forEach(function(val, index, array) { console.log(val); });
(1)のように、C言語のprintfのようなフォーマットを指定して出力することも可能です。以下のフォーマットが利用可能です。
- %s - 文字列
- %d - 数値(整数、浮動小数点)
- %j - JSON形式
(2)のようにconsole以外にも、__dirname/__filenameといったグローバルオブジェクトが登録されており、これらを利用することもできます。
(3)のprocessも同じくグローバルオブジェクトです。配列argvには、起動時に渡された引数が格納されています。この例では、配列が持つforEach関数によってすべての内容を表示しています。
下表にconsoleオブジェクトに定義された代表的な関数名を示します。
関数名 | 概要 |
log(object, [arg], [...]) | 改行付きで標準出力へ出力します。 |
info(object, [arg], [...]) | logの別名です。 |
warn(object, [arg], [...]) | 改行付きで標準エラー出力へ出力します。 |
error(object, [arg], [...]) | warnの別名です。 |
dir(object) | オブジェクトを文字列化し、標準エラー出力へ出力します。 |
trace() | 現在のスタックトレースを標準エラー出力へ出力します。 |
assert(value, [message]) | アサートです。式がfalseならば現在のスタックトレースを出力します。 |
非同期処理の確認
Node.jsは元々スケーラブルなネットワークアプリケーションを開発するために構築されました。スケーラビリティを実現するためにはいくつかの方法がありますが、Node.jsはシングルスレッド、非同期処理というアプローチを採用しています。ここでは、その非同期処理について簡単に説明します。
前述の例では、Node.jsの特徴である非同期処理の例が見て取れませんが、以下のリスト3のサンプルを実行するとその一端が垣間見えます。
// コールバック関数 function callback(i) { console.log('callback = %d', i); } // 100回 コールバック関数を呼び出すようにスケジュールする for(var i = 1; i < 100; i++) { setTimeout(callback, 0, i); }
setTimeout関数は、第2引数で与えたられた時間(ミリ秒)が経過したあとに、第1引数のコールバック関数が1度だけ呼ばれるようにスケジュールします。第3引数以降は、コールバック関数に渡す引数となります。
リスト4の例では、callback関数を0ミリ秒後(すなわち直ち)に、変数iを引数に呼び出すように指示しています。
この実行結果を確認してみましょう(図3)。
実行する環境によってばらつきはあると思いますが、1から順に出力されないことが確認できます。Node.jsはコールバック関数が呼び出されるタイミングや順序を保証していないためこのようになります。順序性を保証したい場合は、コールバック関数の中で次の処理を実行する必要があります。次節ではファイルの操作を行いながら、この点について確認していきます。