イベント
Node.jsの多くのオブジェクトはイベントを発生します。Windows Formプログラミングで言えば、ボタンのクリックイベントになどがそれにあたります。Node.jsでは、これらのイベントを適切にハンドリングしてプログラミングしていくことが肝心です。
どんなオブジェクトがどのようなイベントを発生するのかはリファレンスを参照していただくとして、リスト7にサンプルを用意しました。処理としては、標準入力から読み込んだ文字列をファイルに出力するものです。
// (1)モジュールの読み込み var fs = require('fs'); var readline = require('readline'); // (2)ファイルストリームの作成 var stream = fs.createWriteStream('test.txt'); // (3)openイベントにリスナーを登録 stream.on('open', function(fd) { console.log('File opened.'); // (4)リードラインの設定 var rl = readline.createInterface(process.stdin, process.stdout); // (5)readlineの行入力に対するリスナーの登録 rl.on('line', function(line) { stream.write(line + '\n'); }); // (6)readlineの終了に対するリスナーの登録 rl.on('close' , function() { fs.close(fd); process.exit(0); }); });
処理の流れを確認する前に実行してみます。スクリプトを実行し、適当な文字列を入力します。CTRL-Cでスクリプトを抜けmoreコマンドでテキストファイルの内容を確認すると、入力された文字列が格納されているのが確認できるでしょう(図6)。
処理の流れを確認しましょう。
(1)今回は、標準入力からの読み込みにReadlineモジュールを利用します。これも標準モジュールの一つです。
(2)fs.createWriteStreamメソッドでファイルへの書き込みストリーム作成します。
(3)ストリームに対するイベントリスナーの登録をonメソッドで行います。別名としてaddListenerメソッドも用意されていますが、onメソッドを使うの一般的です。第1引数はイベント名を指定し、第2引数にイベントリスナー(コールバック関数)を指定します。この例では、ファイルが書き込みモードでオープンされたときに呼ばれます。
(4)、(5)、(6)は 標準入力からの読み込みに対応した処理です。lineイベントは、標準入力からEnterキーを伴う入力があったときに呼ばれ、closeイベントはCTRL-Cによる終了時に呼ばれます。それぞれ、ストリームへの書き込みと、クローズを実施しています。
リスト7のサンプルはリスト2などのと違い、イベントを登録しているとNode.jsは終了せずにイベントループに入ります。プログラム中では適宜発生するイベントを処理するため待機状態になり、適宜発生したイベントを非同期に処理していきます。
まとめ
今回は、Node.jsに対する基礎的な機能を紹介しました。JavaScriptに習熟している方は特に問題なくNode.js固有部分が理解できたと思います。一方、C#やJavaに代表される静的な型付け言語に慣れているとJavaScript固有のクセもあって、やや取っ付きにくい印象を与えるかもしれません。
また、勘の良い方はすでに気づかれているかもしれませんが、Node.js(非同期処理)において順序性を維持しようとするとネストが深くなってしまう傾向があります。これに関しては、Webを検索するといくつか興味深い試みが行われているので、興味がある方は検索してみてください。
次回はもう一度Windows Azureから離れて、Node.jsの基本部分であるHTTPモジュールの扱いについて解説し、次々回へのWindows Azureストレージ操作へつなげていきたいと思います。