本文,将使用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模块奥义!开发一个数据库。相关推荐

  1. 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(一)

    这几篇都是我原来首发在 segmentfault 上的地址:https://segmentfault.com/a/1190000005040834 突然想起来我这个博客冷落了好多年了,也该更新一下,呵 ...

  2. 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(三)

    前篇 使用React.Node.js.MongoDB.Socket.IO开发一个角色投票应用的学习过程(一) 使用React.Node.js.MongoDB.Socket.IO开发一个角色投票应用的学 ...

  3. 用node.js 搭建的博客程序心得(node.js实战读书笔记1)

    学习node已经有一段时间了,之前把了不起的node.js看完了,基本算了解了一些node的基本的用法还有一些概念了,然后就开始看第二本node.js实战,第一章就是搭建一个博客程序.但是不得不吐槽一 ...

  4. 妙味课堂ajax教程,前后端高级实战 | Node.js 实战开发:博客系统【妙味课堂】

    第一部分:Node.js基础视频内容 1-初识NodeJs 2-webstorm的使用 3-Node和JS的异同 4-模块的使用 5-模块加载机制 6-模块-module和exports 7-glob ...

  5. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 处理静态资源

    视频地址:www.cctalk.com/v/151149238- 处理静态资源 无非花开花落,静静. 指定静态资源目录 这里我们使用第三方中间件: koa-static 安装并使用 安装 koa-st ...

  6. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志

    为什么80%的码农都做不了架构师?>>>    沪江CCtalk视频地址:https://www.cctalk.com/v/15114923883523 log 日志中间件 最困难的 ...

  7. 练手项目|Node.js实战——轻松实现听歌识曲

    黑马程序员视频库 播妞QQ号:3077485083 传智播客旗下互联网资讯.学习资源免费分享平台 前端作为当下非常火的职业之一,播妞身边有很多小伙伴在学习前端,但是大部分人在自学过程中十分盲目,不知道 ...

  8. (附源码)Node.js图书管理小程序的开发 毕业设计 250858

    Node.js图书管理小程序的开发 摘 要 大数据时代下,数据呈爆炸式地增长.为了迎合信息化时代的潮流和信息化安全的要求,利用互联网服务于其他行业,促进生产,已经是成为一种势不可挡的趋势.在图书馆管理 ...

  9. iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 路由koa-router

    路由koa-router--MVC 中重要的环节:Url 处理器 ?? iKcamp 制作团队 原创作者:大哼.阿干.三三.小虎.胖子.小哈.DDU.可木.晃晃 文案校对:李益.大力萌.Au.DDU. ...

最新文章

  1. 浏览器下的CSS透明度
  2. 初步了解Linux proc文件系统
  3. 并发编程-22J.U.C组件拓展之Fork/Join框架
  4. 拆解声网Q4财报:除了“元宇宙”,我们还应该关注什么?
  5. 西安交大计算机考研分数线2020院线,西安交通大学2020研究生复试分数线预计4月中旬左右公布...
  6. hdu 5311 Hidden String(find,substr)
  7. 使用GoldenGate进行平台迁移和数据库升级(9i-11g)步骤描述
  8. 【pyqt5学习】——graphicView显示opencv图像
  9. c++批量重命名_手把手教你用Python批量给图片添加水印 | 知了干货分享
  10. Oracle毙掉JavaOne
  11. POJ1657 Bailian1657 Distance on Chessboard【基础】
  12. oracle的时间取的到底是谁的时间
  13. java 实现word转txt
  14. 散户通过a股量化数据接口实现自动化实盘交易主要方式有哪些?
  15. 视频如何批量去除水印
  16. ABtest用于推荐系统性能衡量
  17. 如何让工作更有活力?社科院与杜兰大学金融管理硕士项目帮你充电续航
  18. 怎样用c语言画二次函数图像,利用几何画板演示动态的二次函数
  19. 基础光照-Phong 光照模型
  20. 如何做成gif动画图片?教你简单三步制作gif动图

热门文章

  1. 关于linux上运行ONS
  2. CTF论剑场-web15
  3. SWPUCTF2019web题复现
  4. OSError: [WinError 145] 目录不是空的。
  5. linux 编译gdal库下载,各个版本VS编译好的GDAL库下载
  6. 毛毛雨的博客乐园—内容简介
  7. 基于区块链的Smart系统-题库及试卷管理模块的设计与开发
  8. ps写php,ps毛笔字体怎么做
  9. Github标星 8K+,免费又好用的Redis客户端工具!
  10. python拨号_python实现电脑自动拨号换ip(pppoe)