lowdb是一个基于lodash API的轻量级本地JSON数据库 (支持 Node.js , 浏览器 和 Electron)
特点
Small(轻量级)
Serverless(不需要服务器)
lodash rich API(lodash丰富的API)
In-memory or disk-based(基于内存和硬盘的存储)
Hackable (mixins, id, encryption, …)(可以扩展第三方插件,比如lodash-id)
npm install lowdb –save 或者 yarn add lowdb
也可以外部引用使用
1 2 3 4 5 <script src="https://unpkg.com/lodash@4/lodash.min.js" ></script> <script src ="https://unpkg.com/lowdb/dist/lowdb.min.js" > </script > <script > var db = low('db' ) </script >
##使用
low()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 low() low('db.json' , { storage : require ('lowdb/lib/storages/file-async' ) }) low('some-source' , { storage : require ('./my-custom-storage' ) }) const fileSync = require ('lowdb/lib/storages/file-sync' )low('db.json' , { storage : { read : fileSync.read } }) low('db.json' , { storage : { write : fileSync.write } })
db._
一个数据库lodash
实例,用于扩展第三方插件或自定义方法
1 2 3 4 5 6 7 8 db._.mixin({ second : function (array ) { return array[1 ] } }) const post1 = db.get('posts' ).first().value()const post2 = db.get('posts' ).second().value()
db.getState()
获得数据库状态和内容 是个字符串
1 2 3 4 5 db.getState() fs.writeFileSync('db.json' , JSON .stringify(db.getState()))
db.setState(newState)
清空数据库
1 2 3 4 5 6 7 8 9 10 11 12 13 const newState = {} db.setState(newState) `` ` **db.write([source]) db.read([source])** >这两个都是返回一个promise执行异步操作,可以用于备份 ` `` jsconst db = low('db.json' )db.write() db.write('copy.json' )
db.defaults()
初始化一个数据库
1 2 db.defaults({ posts : [], user : {} }) .write()
.id
自动插入id字段,生成一个随机值
1 db.get('posts' ).insert({ title : '今天是个好日子!' }).write().id
根据lodash API 写出的常用写法
是否存在数据
1 2 db.has('posts' ) .value()
设置数据
1 2 db.set('posts' , []) .write()
排序前五
1 2 3 4 5 db.get('posts' ) .filter({published : true }) .sortBy('views' ) .take(5 ) .value()
获得标题
1 2 3 db.get('posts' ) .map('title' ) .value()
获得数量
1 2 3 db.get('posts' ) .size() .value()
获得第一个标题
1 2 db.get('posts[0].title' ) .value()
更新数据
1 2 3 4 db.get('posts' ) .find({ title : 'low!' }) .assign({ title : 'hi!' }) .write()
删除数据
1 2 3 db.get('posts' ) .remove({ title : 'low!' }) .write()
删除一个属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 db.unset('user.name' ) .write()
复制可以用作备份时使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 db.get('posts' ) .cloneDeep() .value() let clone = db.get('posts' ) .cloneDeep() .value() const db1 = low('copy.json' )db1.defaults({posts :clone}).write()
##添加扩展
lodash-id
1 2 3 4 5 6 const db = low('db.json' )db._.mixin(require ('lodash-id' )) const postId = db.get('posts' ).insert({ title : 'low!' }).write().idconst post = db.get('posts' ).getById(postId).value()
uuid
1 2 3 4 const uuid = require ('uuid' )const postId = db.get('posts' ).push({ id : uuid(), title : 'low!' }).write().idconst post = db.get('posts' ).find({ id : postId }).value()
cryptr
加密解密 (这个加密注意一个情况,如果库文件存在的话会报错,只有初始化一个新的才可以)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 const Cryptr = require ("./cryptr" ),const cryptr = new Cryptr('my secret key' )const db = low('db.json' , { format : { deserialize : (str ) => { const decrypted = cryptr.decrypt(str) const obj = JSON .parse(decrypted) return obj }, serialize : (obj ) => { const str = JSON .stringify(obj) const encrypted = cryptr.encrypt(str) return encrypted } } }) db.defaults({ posts : [], user : {} }) .write()
##使用问题总结
set和unset的使用
1 2 3 4 5 6 db.unset('user.age' ).write() db.set('posts[4].title' , '啦啦啦啦' ) .write()
加密解密
这个问题上面已经说了,就是必须生成一个新文件,要不会报错json格式不正确
使用lodash-id
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 db.get('posts' ).insert({id :333 , body : 'New post' }).write() let dd = db.get('posts' ).replaceById(3 ,{body : '心心心心' }).write()db.get('posts' ).find({id :3 }).assign({body :'哈哈哈哈' }).write() app.get('/posts/:id' ,(req,res )=> { console .log(typeof (req.params.id)) const post = db.get('posts' ) .find({ id : parseInt (req.params.id) }) .value() console .log(post) res.send(post) })
使用前一点要初始化数据库文件
曾经遇到过一次,因为清空数据.里面却保存了字符,结果再插入数据时报错 还有一次清空了数据.里面没有了表.插入数据时报错 而且不能初始化两次哦 否则看上去正常插入数据时也会报错
##官方例子 clis.js 用命行令使用方式
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 "use strict" const low = require ('lowdb' )const db = low('db.json' )db.defaults({posts :[]}) .write() const result = db.get('posts' ) .push({name : process.argv[2 ]}) .write() console .log(result)
server.js 这里美精简 整个测试过程全在里面了 挑着用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 const express = require ('express' )const _ = require ('lodash' )_.mixin(require ('lodash-id' )) const low = require ('lowdb' )const fileAsync = require ('lowdb/lib/storages/file-async' )const app = express()const db = low('db/db.json' ,{ storage : fileAsync }) db._.mixin(_) db.defaults({posts :[]}) .write() let aa = db.get('posts' ).getById(3 ).value()let dd = db.get('posts' ).replaceById(3 ,{body : '心心心心' }).write()console .log(dd)console .log('---------------------' )let pp = db.get('posts' ).value()console .log(pp)app.get('/posts/:id' ,(req,res )=> { console .log(typeof (req.params.id)) const post = db.get('posts' ) .find({ id : parseInt (req.params.id) }) .value() console .log(post) res.send(post) }) app.get('/posts' ,(req,res )=> { db.get('posts' ).insert({id :666 , body : '双击屏幕666666666666' }).write().then(post => res.send(post)) }) db.defaults({posts :[]}) .write() .then(()=> { app.listen(8080 ,()=> console .log('Server is listening' )) })
memory.js 内存模式这样应该会速度快很多吧
1 2 3 4 5 6 7 8 9 10 11 12 const fs = require ('fs' )const db = low()db.defaults({ posts : [] }) .write() db.get('posts' ) .push({ title : 'lowdb' }) .write() fs.writeFileSync('db.json' , JSON .stringify(db.getState()))
##参考文档LowDB静态JSON文件数据库介绍