首页 > 数据库技术 > 详细

Node.js实战13:fs模块奥义!开发一个数据库。

时间:2019-12-17 17:10:31      阅读:86      评论:0      收藏:0      [点我收藏+]

本文,将使用fs开发一种简单的文件型数据库。

数据库中,记录将采用JSON模式,内容型如:

{"key":"a","value":"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继承,让本模块具有“事件”触发能力,可以在调用时使用on函数;

2、实例化时,输入数据库路径(如不存在,会自动创建);

3、load、get、set、del函数的实现;

4、回车换行,\r\n;

5、emit触发load事件,load事件会在调用上层响应;

6、为什么用pop();

调用部分(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、响应load事件,即:数据库加载完成;

3、读取、设置、删除各函数的调用。

执行效果:

技术分享图片

数据库内容:

技术分享图片


更多:

技术分享图片

 

 

Node.js实战13:fs模块奥义!开发一个数据库。

原文:https://www.cnblogs.com/w2sft/p/12055509.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!