五、源码简析

想要更深入的理解 NeDB,就需要了解它是如何实现的。我这里给出一些我阅读源码时记忆比较深刻的几个点。

1、所有改变数据的操作 (indert,update,remove),都会触发 persistence.persistNewState 方法,比如可以看一下 datastore.js 第 265-268 行的 Datastore.prototype._insert 方法。该方法决定数据的去处,如果是当作内存数据库来用,该方法会提前返回,如果是本地文档持久化存储,则会将数据经过 utf-8 编码序列化之后追加到备份数据库的文档中。

2、数据在 model.js 中通过 serialize 方法被序列化,该方法使用 JSON.stringfy 序列化 json 数据,在回调函数中将 undefined 类型值映射为 null,并且使用与 mongoDB 相同的规则 (不能以”$” 开头,也不能包含”.”) 校验属性的有效性。

3、数据从硬盘上加载到内存时,使用了 async 模块的 waterfall 方法。该方法参数是由方法组成的数组,并且先执行的方法会将执行结果传入下一个方法,方法按顺序执行,并且当其中一个方法报错,就会导致后面的方法不再执行,直接在主方法回调抛出异常。

4、包括当持久层初始化时从磁盘上加载数据在内的所有的操作命令都会通过 Executor 类的实例,将方法传入队列,保证命令可以按序执行(包括同步与异步方法)。

源码并不难理解,通过以上几点,希望可以让大家更容易解读源码。通读 NeDB 的源码,对 Node 异步 I/O 以及基于事件编程的思想会有进一步的认识。

为了方便大家理解,对官方文档做了简单翻译,如有不当的地方希望大家指正,中文 API 文档如下: