时间:2021-07-01 10:21:17 帮助过:6人阅读
然后我们在app.js 添加如下代码:
- const low = require(‘lowdb‘<span style="color: #000000;">);
- const FileSync </span>= require(‘lowdb/adapters/FileSync‘<span style="color: #000000;">);
- const adapter </span>= <span style="color: #0000ff;">new</span> FileSync(‘./db.json‘<span style="color: #000000;">);
- const db </span>=<span style="color: #000000;"> low(adapter);
- db.defaults({posts: [], user: {}, count: </span>0 }).write();
如上保存后,我们在命令行中执行 node app.js 后,会在我们的项目中的根目录下新建一个叫 db.json 文件,该文件代码变成如下所示:
- <span style="color: #000000;">{
- </span>"posts"<span style="color: #000000;">: [],
- </span>"user"<span style="color: #000000;">: {},
- </span>"count": 0<span style="color: #000000;">
- }</span>
如上代码,引入 lowdb包,然后引入 lowdb 中的适配器 FileSync。
lowdb自带的适配器有:FileSync、FileAsync 和 LocalBrowser。分别有以下可选参数:
defaultValue: 文件不存在时的默认值。
serialize/deserialize: 文件被写之前和读之后的操作。
比如如下代码:
- const low = require(‘lowdb‘<span style="color: #000000;">);
- const FileSync </span>= require(‘lowdb/adapters/FileSync‘<span style="color: #000000;">);
- const adapter </span>= <span style="color: #0000ff;">new</span> FileSync(‘./db.json‘<span style="color: #000000;">, {
- serialize: (data) </span>=><span style="color: #000000;"> JSON.stringify(data),
- deserialize: (data) </span>=><span style="color: #000000;"> JSON.parse(data)
- });
- const db </span>=<span style="color: #000000;"> low(adapter);
- db.defaults({posts: [], user: {}, count: </span>0 }).write();
如上代码,如果我们的db.json 没有数据的时候 才会重新调用 db.defaults初始化数据,否则的话会使用本地存储的数据。我们可以更改 count 的值试试看,不管我们在node命令行中运行多少次,值都是一样的,但是当我们把 db.json内容删除掉后,我们再运行下,发现最新的内容被写入进去了。
如上代码,如果我们把上面的代码改成这样的如下:
- const low = require(‘lowdb‘<span style="color: #000000;">);
- const FileSync </span>= require(‘lowdb/adapters/FileSync‘<span style="color: #000000;">);
- const adapter </span>= <span style="color: #0000ff;">new</span> FileSync(‘./db.json‘<span style="color: #000000;">, {
- serialize: (data) </span>=><span style="color: #000000;"> console.log(data),
- deserialize: (data) </span>=><span style="color: #000000;"> console.log(data)
- });
- const db </span>=<span style="color: #000000;"> low(adapter);
- db.defaults({posts: [], user: {}, count: </span>30 }).write();
那么在命令行中运行下,第一次被写入之前 serialize 打印 为 {} 空对象。然后就执行 db.defaults 操作就会把对应的数据写入到 db.json 文件中,然后我们就会执行 deserialize 操作对文件进行读取,然后在命令行中会打印 { posts: [], user: {}, count: 30 }。 打印完成后,我们没有做任何操作后,最后我们再来查看下 db.json文件的内容变成了 undefined. 因此我们可以判定 serialize 和 deserialize 这两个操作完成后,他们也会对文件进行写入操作。如果没有值被写入或操作的话,那么文件内容就变为undefined。当文件变为undefined后,我们再执行上面的代码,可以看到 db.defaults({posts: [], user: {}, count: 30 }).write(); 这句代码是不会被写入的。那么我们可以猜想的到,这句代码的含义是会判断该文件 有没有内容,如果没有内容的话文件数据才会被写入,否则的话就不会执行任何操作。我们可以再把 db.json 文件内容全部删除掉,我们再运行下 node app.js 命令后,可以看到这个时候 数据才会被写入进去。
1. 设置数据
我们可以对 db.json 数据里面设置某个字段的数据,比如如下代码:
- const low = require(‘lowdb‘<span style="color: #000000;">);
- const FileSync </span>= require(‘lowdb/adapters/FileSync‘<span style="color: #000000;">);
- const adapter </span>= <span style="color: #0000ff;">new</span> FileSync(‘./db.json‘<span style="color: #000000;">, {
- serialize: (data) </span>=><span style="color: #000000;"> JSON.stringify(data),
- deserialize: (data) </span>=><span style="color: #000000;"> JSON.parse(data)
- });
- const db </span>=<span style="color: #000000;"> low(adapter);
- db.defaults({posts: [], user: {}, count: </span>30<span style="color: #000000;"> }).write();
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置数据 </span>
- db.set("user.name", ‘kongzhi‘).write();
然后我们的 db.json 数据变成如下了:
- {"posts":[],"user":{"name":"kongzhi"},"count":30}
2. 获取数据
我们可以对json文件获取某个字段后的值,然后进行添加数据操作,或者删除数据操作,总之我们可以操作数据,如下代码:
- const low = require(‘lowdb‘<span style="color: #000000;">);
- const FileSync </span>= require(‘lowdb/adapters/FileSync‘<span style="color: #000000;">);
- const adapter </span>= <span style="color: #0000ff;">new</span> FileSync(‘./db.json‘<span style="color: #000000;">, {
- serialize: (data) </span>=><span style="color: #000000;"> JSON.stringify(data),
- deserialize: (data) </span>=><span style="color: #000000;"> JSON.parse(data)
- });
- const db </span>=<span style="color: #000000;"> low(adapter);
- db.defaults({posts: [], user: {}, count: </span>30<span style="color: #000000;"> }).write();
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置数据 </span>
- db.set("user.name", ‘kongzhi‘<span style="color: #000000;">).write();
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> get 数据, 然后添加一条数据进去,最后写入文档里面去。</span>
- db.get(‘posts‘).push({‘id‘: 1, ‘title‘: ‘welcome to hangzhou‘ }).write();
我们的db.json 文件代码变成如下所示:
- {"posts":[{"id":1,"title":"welcome to hangzhou"}],"user":{"name":"kongzhi"},"count":30}
3. 更新数据,我们可以对某条数据进行更新。如下代码所示:
- const low = require(‘lowdb‘<span style="color: #000000;">);
- const FileSync </span>= require(‘lowdb/adapters/FileSync‘<span style="color: #000000;">);
- const adapter </span>= <span style="color: #0000ff;">new</span> FileSync(‘./db.json‘<span style="color: #000000;">, {
- serialize: (data) </span>=><span style="color: #000000;"> JSON.stringify(data),
- deserialize: (data) </span>=><span style="color: #000000;"> JSON.parse(data)
- });
- const db </span>=<span style="color: #000000;"> low(adapter);
- db.defaults({posts: [], user: {}, count: </span>30<span style="color: #000000;"> }).write();
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置数据 </span>
- db.set("user.name", ‘kongzhi‘<span style="color: #000000;">).write();
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> get 数据, 然后添加一条数据进去,最后写入文档里面去。</span><span style="color: #008000;">
- //</span><span style="color: #008000;"> db.get(‘posts‘).push({‘id‘: 1, ‘title‘: ‘welcome to hangzhou‘ }).write();</span>
- <span style="color: #008000;">//</span><span style="color: #008000;"> 使用 update 更新数据 这里的n 就是 count 的默认值,在db.json中的count默认值为30, 最后写入进去</span>
- db.update(‘count‘, n => n + 1).write();
运行后 db.json 数据代码如下所示:
- {"posts":[{"id":1,"title":"welcome to hangzhou"}],"user":{"name":"kongzhi"},"count":31}
注意:由于我们的 lowdb 基于 lodash 的,因此我们可以使用 lodash 中的所有方法和属性。
4. find 查找字段中数据
我们可以对 db.json 中的某个字段的数据进行查找。代码如下所示:
- const low = require(‘lowdb‘<span style="color: #000000;">);
- const FileSync </span>= require(‘lowdb/adapters/FileSync‘<span style="color: #000000;">);
- const adapter </span>= <span style="color: #0000ff;">new</span> FileSync(‘./db.json‘<span style="color: #000000;">, {
- serialize: (data) </span>=><span style="color: #000000;"> JSON.stringify(data),
- deserialize: (data) </span>=><span style="color: #000000;"> JSON.parse(data)
- });
- const db </span>=<span style="color: #000000;"> low(adapter);
- db.defaults({posts: [], user: {}, count: </span>30<span style="color: #000000;"> }).write();
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> 设置数据 </span>
- db.set("user.name", ‘kongzhi‘<span style="color: #000000;">).write();
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> get 数据, 然后添加一条数据进去,最后写入文档里面去。</span><span style="color: #008000;">
- //</span><span style="color: #008000;"> db.get(‘posts‘).push({‘id‘: 1, ‘title‘: ‘welcome to hangzhou‘ }).write();</span>
- <span style="color: #008000;">//</span><span style="color: #008000;"> 使用 update 更新数据 这里的n 就是 count 的默认值,在db.json中的count默认值为30, 最后写入进去</span>
- db.update(‘count‘, n => n + 1<span style="color: #000000;">).write();
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> 查找数据</span>
- const value = db.get(‘posts‘).find({‘id‘: 1<span style="color: #000000;">}).value();
- console.log(value);</span>
假如我们的db.json 代码如下:
- {"posts":[{"id":1,"title":"welcome to hangzhou"}],"user":{"name":"kongzhi"},"count":33}
因此我们通过 db.get(‘posts‘).find({‘id‘: 1}).value() 后就可以获取到值了,如下所示:
5. lowdb 的API
1. low(adapter): 它返回一个具有特定属性和功能的 lodash.
2. db.[...].write()/.value(): write() 方法是写入数据,value()方法是读取数据。
3. db.getState()/.setState(): 获取/设置数据库的状态。
4. db._ 数据库的lodash的实列。我们可以使用这个来添加我们自己的函数或者第三方的mixins。比如 lodash-id(https://github.com/typicode/lodash-id)
mixins 的使用列子如下:
代码如下:
- const low = require(‘lowdb‘<span style="color: #000000;">);
- const FileSync </span>= require(‘lowdb/adapters/FileSync‘<span style="color: #000000;">);
- const adapter </span>= <span style="color: #0000ff;">new</span> FileSync(‘./db.json‘<span style="color: #000000;">, {
- serialize: (data) </span>=><span style="color: #000000;"> JSON.stringify(data),
- deserialize: (data) </span>=><span style="color: #000000;"> JSON.parse(data)
- });
- const db </span>=<span style="color: #000000;"> low(adapter);
- db.defaults({posts: [], user: {}, count: </span>30<span style="color: #000000;"> }).write();
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> 使用 mixin 混合模式来扩展我们自己的方法</span>
- <span style="color: #000000;">db._.mixin({
- getSecondData: </span><span style="color: #0000ff;">function</span><span style="color: #000000;">(arr) {
- </span><span style="color: #0000ff;">return</span> arr[1<span style="color: #000000;">];
- }
- });
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> 调用 getSecondData 方法 获取到 posts 第二条数据</span>
- const xx = db.get(‘posts‘<span style="color: #000000;">).getSecondData().value();
- console.log(xx);</span>
假如我们的db.json 代码如下数据:
- <span style="color: #000000;">{
- </span>"posts"<span style="color: #000000;">:[
- {</span>"id":1,"title":"welcome to hangzhou"<span style="color: #000000;">},
- {</span>"id":2,"title":"welcome to hangzhou"<span style="color: #000000;">}
- ],
- </span>"user":{"name":"kongzhi"<span style="color: #000000;">},
- </span>"count":33<span style="color: #000000;">
- }</span>
我们运行 node app.js 命令后,可以看到,我们可以获取到数组里面的第二条数据了,如下所示:
6. db.getState/db.setState 获取数据库状态/设置数据库的状态, 如下代码演示:
- const low = require(‘lowdb‘<span style="color: #000000;">);
- const FileSync </span>= require(‘lowdb/adapters/FileSync‘<span style="color: #000000;">);
- const adapter </span>= <span style="color: #0000ff;">new</span> FileSync(‘./db.json‘<span style="color: #000000;">, {
- serialize: (data) </span>=><span style="color: #000000;"> JSON.stringify(data),
- deserialize: (data) </span>=><span style="color: #000000;"> JSON.parse(data)
- });
- const db </span>=<span style="color: #000000;"> low(adapter);
- db.defaults({posts: [], user: {}, count: </span>30<span style="color: #000000;"> }).write();
- </span><span style="color: #008000;">//</span><span style="color: #008000;"> 获取数据库的状态</span>
- <span style="color: #000000;">console.log(db.getState());
- const newState </span>=<span style="color: #000000;"> {}
- db.setState(newState);
- console.log(</span>‘-----------‘<span style="color: #000000;">);
- console.log(db.getState());</span>
db.json 假如数据如下:
- <span style="color: #000000;">{
- </span>"posts"<span style="color: #000000;">:
- [
- {</span>"id":1,"title":"welcome to hangzhou"<span style="color: #000000;">},
- {</span>"id":2,"title":"welcome to hangzhou"<span style="color: #000000;">}
- ],
- </span>"user":{"name":"kongzhi"<span style="color: #000000;">},
- </span>"count":33<span style="color: #000000;">
- }</span>
运行结果如下图所示:
7. 其他json数据操作
比如 db.json 数据如下所示:
- <span style="color: #000000;">{
- </span>"posts"<span style="color: #000000;">:
- [
- {</span>"id":1,"title":"welcome to hangzhou"<span style="color: #000000;">},
- {</span>"id":2,"title":"welcome to hangzhou"<span style="color: #000000;">}
- ],
- </span>"user":{"name":"kongzhi"<span style="color: #000000;">},
- </span>"count":33<span style="color: #000000;">
- }</span>
1. 检查db.json中有没有 ‘posts‘ 这个字段是否存在。如下测试代码:
- db.has(‘posts‘).value(); <span style="color: #008000;">//</span><span style="color: #008000;"> 如果有该字段就会返回 true, 否则的话,返回false.</span>
2. 设置值 set
- db.set(‘posts‘, []).write(); <span style="color: #008000;">//</span><span style="color: #008000;"> 运行完成后,就会对 posts 字段设置为 空数组了 [];</span>
3. 获取特定字段的值
- db.get(‘posts‘).map(‘id‘).value(); <span style="color: #008000;">//</span><span style="color: #008000;"> 执行完成后会返回 [1, 2]</span>
4. 获取数量
- db.get(‘posts‘).size().value(); <span style="color: #008000;">//</span><span style="color: #008000;"> 返回该数组的长度为 2</span>
5. 获取特定信息的值
- db.get(‘posts[0].id‘).value(); <span style="color: #008000;">//</span><span style="color: #008000;"> 就会返回 1. </span>
6. 更新信息
- db.get(‘posts‘<span style="color: #000000;">)
- .find({title: </span>‘welcome to hangzhou‘<span style="color: #000000;">})
- .assign({name: </span>‘kongzhi‘<span style="color: #000000;">})
- .write();</span>
如上代码,我们可以看到,我们获取 posts这个字段,然后通过 find这个关键字去查找 {title: ‘welcome to hangzhou‘} 这样的,如果找到,就把 它改成 assign 里面的对象值。如果没有找到,就会在该对象里面添加该值,因此上面的结果返回如下:
- <span style="color: #000000;">{
- </span>"posts"<span style="color: #000000;">:[
- {</span>"id":1,"title":"welcome to hangzhou","name":"kongzhi"<span style="color: #000000;">},
- {</span>"id":2,"title":"welcome to hangzhou"<span style="color: #000000;">}
- ],
- </span>"user":{"name":"kongzhi"<span style="color: #000000;">},
- </span>"count":33<span style="color: #000000;">
- }</span>
如果我们把上面的语句改成如下语句,就会更改对应的值了:
- db.get(‘posts‘<span style="color: #000000;">)
- .find({name: </span>‘kongzhi‘<span style="color: #000000;">})
- .assign({name: </span>‘xxx‘<span style="color: #000000;">})
- .write();</span>
那么结果就变成如下:
- <span style="color: #000000;">{
- </span>"posts"<span style="color: #000000;">:[
- {</span>"id":1,"title":"welcome to hangzhou","name":"xxx"<span style="color: #000000;">},
- {</span>"id":2,"title":"welcome to hangzhou"<span style="color: #000000;">}
- ],
- </span>"user":{"name":"kongzhi"<span style="color: #000000;">},
- </span>"count":33<span style="color: #000000;">
- }</span>
7. 删除信息
- db.get(‘posts‘<span style="color: #000000;">)
- .remove({name: </span>‘xxx‘<span style="color: #000000;">})
- .write();</span>
那么结果就变为如下了:
- <span style="color: #000000;">{
- </span>"posts"<span style="color: #000000;">:[
- {</span>"id":2,"title":"welcome to hangzhou"<span style="color: #000000;">}
- ],
- </span>"user":{"name":"kongzhi"<span style="color: #000000;">},
- </span>"count":33<span style="color: #000000;">
- }</span>
8. 移除属性
- db.unset(‘posts[0].id‘).write();
那么结果变为如下了:
- {"posts"<span style="color: #000000;">:[
- {</span>"title":"welcome to hangzhou"<span style="color: #000000;">}
- ],
- </span>"user":{"name":"kongzhi"<span style="color: #000000;">},
- </span>"count":33<span style="color: #000000;">
- }</span>
9. 深拷贝
- <span style="color: #0000ff;">var</span> xx = db.get(‘posts‘<span style="color: #000000;">).cloneDeep().value();
- console.log(xx); </span><span style="color: #008000;">//</span><span style="color: #008000;"> 打印:[ { title: ‘welcome to hangzhou‘ } ]</span>
了解更多相关的知识,请看这里
学习Lowdb小型本地JSON数据库
标签:运行 pack log install nbsp serialize str size turn