Node.js实战13:fs模块奥义!开发一个数据库。
本文,将使用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模块奥义!开发一个数据库。的更多相关文章
- 使用React、Node.js、MongoDB、Socket.IO开发一个角色投票应用的学习过程(三)
这几篇都是我原来首发在 segmentfault 上的地址:https://segmentfault.com/a/1190000005040834 突然想起来我这个博客冷落了好多年了,也该更新一下,呵 ...
- Node.js实战项目学习系列(2) 开发环境和调试工具
前言 上一节让我们对Node.js有一个初步的了解,那么现在可以开始正式学习下Node.js的开发了,但是任何一门语言要设计到开发,就必须先学习开发环境以及调试.本文将主要讲解这些内容. 本文涉及到的 ...
- Node.js实战2:模块使用入门。
NodeJS有丰富的三方模块,借助这些模块,可以快速的开发各类应用.这使用Nodejs可以进行很便捷.快速的开发. 1.安装与加载模块内核.三方 使用npm可以搜索.安装.卸载模块. 例: 搜索模块 ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 错误处理
沪江CCtalk视频地址:https://www.cctalk.com/v/15114923887518 处理错误请求 爱能遮掩一切过错. 当我们在访问一个站点的时候,如果访问的地址不存在(404), ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 记录日志
沪江CCtalk视频地址:https://www.cctalk.com/v/15114923883523 log 日志中间件 最困难的事情就是认识自己. 在一个真实的项目中,开发只是整个投入的一小部分 ...
- iKcamp|基于Koa2搭建Node.js实战(含视频)☞ 视图Nunjucks
视频地址:https://www.cctalk.com/v/15114923888328 视图 Nunjucks 彩虹是上帝和人类立的约,上帝不会再用洪水灭人. 客户端和服务端之间相互通信,传递的数据 ...
- Node.js实战10:“流”是Node.js最强大的功能之一。
流是Nodejs的高级应用,掌握流的使用,才能真正胜任NodeJS开发. Nodejs中,流是基于事件的API,用于管理和处理数据,而且效率很好! 什么是流? 流是一个抽象接口,Node 中有很多对象 ...
- 基于 Angularjs&Node.js 云编辑器架构设计及开发实践
基于 Angularjs&Node.js 云编辑器架构设计及开发实践 一.产品背景 二.总体架构 1. 前端架构 a.前端层次 b.核心基础模块设计 c.业务模块设计 2. Node.js端设 ...
- 《Node.js实战(双色)》作者之一——吴中骅访谈录
随机推荐
- socket客户端怎么判断http响应数据的结束
前言 原文地址:https://blog.csdn.net/nimasike/article/details/81122784 http连接 短连接 定义:http头不包含Connection: Ke ...
- Python核心技术与实战——七|自定义函数
我们前面用的代码都是比较简单的脚本,而实际工作中是没有人把整个一个功能从头写到尾按顺序堆到一块的.一个规范的值得借鉴的Python程序,除非代码量很少(10行20行左右)应该由多个函数组成,这样的代码 ...
- maven 依赖显示红线 pom文件不显示红线的一种可能问题
pom文件引用的是CDH的jar包 而没有配置CDH的仓库 导致maven找不到资源 ,依赖显示红色波浪,并且在仓库内生成了一堆.lastupdate文件 解决: 1. 删除本地仓库内所有的.las ...
- LOJ6358 前夕
上来4的倍数又要交集恰好 单位根反演+二项式反演定了( 具体推柿子放下面了qwq $g(n) = \sum_{i=n}^N f(i) \binom{i}{n} \\g(n) = \binom{N}{n ...
- jquery 对于新插入的节点 的操作绑定(点击事件,each等)
因为最近项目遇到这个问题,下面给大家带来一篇Jquery对新插入的节点 获取并对这个节点绑定事件失效的解决方法.我觉得挺不错的,大家也可以参考一下: 对于绑定事件来讲: 方法一:使用liv ...
- 【LuoguP3747】[六省联考2017] 相逢是问候
题目链接 题意 给定一个长度为 n 的序列 a , 给定一个正整数 c 每次修改操作是把一段区间内的数 \(x_i\) 修改为 \(c^{x_i}\) 询问区间和模 p 的结果 Sol 修改是把一个数 ...
- jquery编写插件(转)
教你开发jQuery插件(转) 阅读目录 基本方法 支持链式调用 让插件接收参数 面向对象的插件开发 关于命名空间 关于变量定义及命名 压缩的好处 工具 GitHub Service Hook 原 ...
- Python---进阶---logging---装饰器打印日志2
### logging - logging.debug - logging.info - logging.warning - logging.error - logging.critical ---- ...
- React Native 中吐司组件react-native-easy-toast
https://github.com/crazycodeboy/react-native-easy-toast 用法: import Toast from 'react-native-easy-toa ...
- php array_shift()函数 语法
php array_shift()函数 语法 作用:删除数组中第一个元素,并返回被删除元素的值.富瑞联华 语法:array_shift(array) 参数: 参数 描述 array 必需.规定数组. ...