[nodejs] ファイルの読み書きにTRY

2015年10月5日

Nodejs テクノロジー プログラミング

通常のJavaScriptではできないnodejs特有の機能の一つにサーバーサイドの「ファイル操作」があります。 クライアントブラウザでしか動作しない通常のjavascriptは、あくまでブラウジングの動的動作を行うことしか出来ないのですが、 サーバーサイドで操作しているnodejsは言語としてはjavascriptなんですが、サーバーにあるファイルをPHP連動をしなくても読み込めるし、CGIを連動しなくても、データを直接書き込むことも可能です。 プログラムの基本として「ファイルの読み書き」は、システムを構築する際に必須になる事なので、ファイルの読み書き関連をメモしておくことにします。 サーバーにはnodejsがインストールされている状態とします。 nodejsがインストールされていない場合は過去記事を参考にしてください。 Node.jsを短期学習してみる #1「インストール」

ファイルに書き込み

JSONデータを任意で作ってサーバー上のローカルファイルとして書き込みをします。

fileWrite.js

var fs = require("fs"); var data = { smartphone:{ iPhone:"Apple", Android:"Google", Blackberry:"rim" }, pc:{ windows:"Microsoft", mac:"Apple" }, printer:[ "epson", "canon", "hp" ] }; fs.writeFile("data.json",JSON.stringify(data,null," ")); ターミナルで実行 $ node fileWrite.js 「data.json」というファイルができていて、内容に上記のデータが書き込まれていれば成功です。

ファイルの読み込み

先ほど書き込んだデータを読み込んでJSONデータとして取得します。

fileRead.js

var fs = require("fs"); fs.readFile("data.json","utf8",function(err,data){ if(err){throw err;} var json = JSON.parse(data); console.log(json.printer.length); }); ターミナルで実行 $ node fileRead.js > 3 ファイル読み込みの時に、option箇所に"utf8"とも文字コードを入れないと文字化けをしてしまうので、注意しよう。 また、読み込まれたデータはJSON.parse関数でデコードする事も忘れないように。 サンプルプログラムでは、データのprinter階層の要素数を表示しているので、「3」と表示されれば、成功です。

レコードデータとして扱ってみる。

MongoDBのように扱うために、書き込みデータを1行単位のレコード方式にして、対応し、読み込みは、レコード参照できるようにしてみる。 SQLと同じルールとして各レコードにはユニークIDを保持するようにします。 // data-write //初期設定 var fs = require("fs"); var dataFile = "record.json"; //データ作成 var data = [ {id:1,value:"data-1"}, {id:2,value:"data-2"}, {id:3,value:"data-3"}, {id:4,value:"data-4"} ]; //データ書き込み for(var i=0;i<data .length;i++){ var record = JSON.stringify(data[i]); fs.appendFile(dataFile,record+"\n"); } //データ読み込み fs.readFile(dataFile,"utf8",function(err,data){ if(err){throw err;} var json = {}; //改行で分解 var records = data.split("\n"); //record別にデータに格納 for(var i=0;i<records.length;i++){ //空行は処理しない if(!records[i]){continue} //record毎にjsonデコード var d1 = JSON.parse(records[i]); //idカラムが無いrecordは処理しない if(typeof d1.id == "undefined"){continue} //データを保持する json[d1.id] = d1; } console.log(json["4"].value); }); 今回は書き込みは追記方式にしたい為、上記で使用しているwriteFileでは、ファイル書き込み自体が上書きになってしまうので「appendFile」関数を使う事にする。

データベースとしても使える

ちなみに、同一IDで追記された場合、後述データが有効になるので、フラグ処理を施せば、postgresのデータ構造と同じ状態が作れる。 同一行を削除する処理を作ればバキューム処理と同じになるので、扱い易いかもしれませんね。 ただ、このデータ構造の注意点としては、容量の大きいデータ郡にしてしまうと、サーバーサイドのメモリが増大化してしまうので、 この辺の効率化は次回以降に考えたいと思う。 シングル処理する事を考えると悪くないシステムが作れるはずだ。