> 社会
fsode(ode中fs模块提供可操作文件的方法有哪些)
导语:Node.js实战13:fs模块奥义!开发一个数据库
本文,将使用fs开发一种简单的文件型数据库。
数据库中,记录将采用JSON模式,内容型如:
{&34;:&34;,&34;:&34;}
支持查询、更新、删除操作。
代码分两部分,一部分是我们将其写为模块,另一部分,是对该模块的调用。
直入主题,
模块部分(文件名:database.js)://核心模块var fs = require(&34;);var event_emitter = require(&34;).EventEmitter;//我们的数据库,初始化参数是数据库路径(含文件名)var database = function(path){ this.path = path; this.records = Object.create(null); //流,写文件 this.write_stream = fs.createWriteStream(this.path,{encoding:&34;,flags:&34;}); this.load()}//类式继承,让database具备事件能力database.prototype = Object.create(event_emitter.prototype);//异步操作,通过EventEmiter实现:在加载完记录后,发出load事件。database.prototype.load = function(){ //流,读文件 var stream = fs.createReadStream(this.path,{encoding:&34;}); var database_this = this; var data = &34;; //流的读取事件 stream.on(&34;,function(){ data += stream.read(); //以换行为分割 var record_stream = data.split(&34;); 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(&34;,function(){ database_this.emit(&34;); });}//根据key值,返回对应的valuedatabase.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})+&34;; 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(&34;);var client = new database(&34;);client.on(&34;,function(){ console.log(&34;); console.log( client.get(&34;) ); client.set(&34;,&34;,function(err){ console.log(&34;,err); }) client.del(&34;);});
重点解析:
1、初始始化模块、传入数据库路径;
2、响应load事件,即:数据库加载完成;
3、读取、设置、删除各函数的调用。
执行效果:数据库内容:更多本系列文章:
Node.js实战12:fs模块高级技巧
Node.js实战11:fs模块初探
Node.js实战10:“流”是Node.js最强大的功能之一
Node.js实战9:用EventEmitter触发和响应事件
Node.js实战8:可用于压缩、加密的zlib
本文内容由小蔼整理编辑!