Node.jsの戦闘13:FSモジュール難解!データベースの開発。

本論文では、FSの使用は、単純なファイルのデータベースを開発しています。

データベース、記録モードは、コンテンツタイプとして、JSONを使用されます。

{ "キー": ""、 "値": "123"}

サポートクエリ、更新、削除操作。

二つの部分、我々はモジュールとしてそれを書きますが、他の部分のコードは、モジュールを求めています。

ストレート対象に、

モジュールの一部(ファイル名:database.js):

//核心模块
var fs = require("fs");
var event_emitter = require("events").EventEmitter; //我们的数据库,初始化参数是数据库路径(含文件名) var database = function(path){ this.path = path; this.records = Object.create(null); //流,写文件 this.write_stream = fs.createWriteStream(this.path,{encoding:"utf8",flags:"a"}); this.load() } //类式继承,让database具备事件能力 database.prototype = Object.create(event_emitter.prototype); //异步操作,通过EventEmiter实现:在加载完记录后,发出load事件。 database.prototype.load = function(){ //流,读文件 var stream = fs.createReadStream(this.path,{encoding:"utf8"}); var database_this = this; var data = ""; //流的读取事件 stream.on("readable",function(){ data += stream.read(); //以换行为分割 var record_stream = data.split("\n"); data = record_stream.pop(); for(var i=0; i<record_stream.length; i++){ var record = JSON.parse(record_stream[i]); if (record.value == null){ delete this.records[record.key]; }else{ database_this.records[record.key] = record.value; } } }); //读取完成 stream.on("end",function(){ database_this.emit("load"); }); } //根据key值,返回对应的value database.prototype.get = function(key){ return this.records[key]||null; } //写入 database.prototype.set = function(key,value,cb){ var to_write = JSON.stringify({key:key,value:value})+"\r\n"; if(value == null){ delete this.records[key]; }else{ this.records[key] = value; } this.write_stream.write(to_write,cb); } //删除 database.prototype.del = function(key,cb){ return this.set(key,null,cb); } module.exports = database;

主な分析:

呼び出し時に1を持つEventEmitter継承ので、このモジュールは、機能をトリガする「イベント」を有することが、機能に使用することができます。

2、インスタンス、入力データベースパス(例えば、存在しない場合、自動的に作成されます)。

3、負荷、デルの機能を達成するため、セットを取得します。

図4に示すように、キャリッジリターン、\ R \ N。

5、EMITイベントトリガ負荷、イベントコール上部における負荷応答。

6.なぜ使用ポップ();

コール部分(test13.js):

var database = require("./database");
var client = new database("./test13.db");

client.on("load",function(){
 console.log("loaded"); console.log( client.get("my site") ); client.set("my site","jshaman.com",function(err){ console.log("write",err); }) client.del("test2"); });

主な分析:

1、最初のモジュール、受信パスデータベースの先頭。

図2は、負荷イベントに応答して、すなわち:データベース負荷が完了する。

図3は、読んで、セットには、各関数への呼び出しを削除します。

結果の実装:

データベースの内容:


多く:

 

 

おすすめ

転載: www.cnblogs.com/w2sft/p/12055509.html