一分鐘入門
lowdb 是一個基于 Lodash 的小型本地 JSON 數據庫。神器!
- 可以語義化較強的查詢/操作方法,對指定的文本文件或者瀏覽器 LocalStorage 內容進行精確的查詢讀寫操作
- 基于 Lodash, 支持大量的處理方法
- 支持 JSON 格式文本及任意可被轉換為 JSON 結構的文本數據 (xml/yaml/toml/ini)
具體使用請參照 Github: https://github.com/typicode/lowdb
數據內容
{
"posts": [
{ "id": 1, "title": "lowdb is awesome" },
{ "id": 2, "title": "sooooooo good" }
],
"user": {
"name": "typicode"
},
"count": 1
}
常用操作
// Node.js
// npm install lowdb
const low = require('lowdb')
const FileSync = require('lowdb/adapters/FileSync')
const adapter = new FileSync('db.json')
const db = low(adapter)
// Add a post
db.get('posts')
.push({ id: 1, title: 'lowdb is awesome'})
.write()
// Set a user using Lodash shorthand syntax
db.set('user.name', 'typicode')
.write()
// Increment count
db.update('count', n => n + 1)
.write()
// Sort the top five posts.
db.get('posts')
.filter({published: true})
.sortBy('views')
.take(5)
.value()
// Get post titles.
db.get('posts')
.map('title')
.value()
// Get the number of posts.
db.get('posts')
.size()
.value()
自定義 serialize/deserialize 函數支持更多格式
const adapter = new FileSync('array.xml', {
defaultValue: [],
serialize: (array) => toXMLString(array),
deserialize: (string) => fromXMLString(string)
})
使用場景
之前使用 JavaScript 寫過很多小工具,包括文件格式轉換,簡單數據處理,文檔生成,代碼生成等等。
這種輕量級的處理場景下本地數據存儲簡直是剛需,在 Node 環(huán)境中我通常使用 JSON 文件來進行存儲,以下是某產品文檔中的一則 FAQ JSON 格式數據示例,生成文檔的時候我需要指定 category 提取相應的信息,指定 rank 來進行文檔排序:
{
"faq": [
{
"title": "EMQ X中ssl resumption session的使用",
"category": "使用教程",
"tag": ["TLS"],
"content": "修改emqx.conf配置中的 reuse_sessions = on 并生效后。",
"rank": 0
},
{
"title": "MQTT 客戶端斷開連接統(tǒng)計",
"category": "運維管理",
"tag": ["指標"],
"content": "執(zhí)行 `emqx_ctl listeners`,查看對應端口下的 `shutdown_count` 統(tǒng)計。",
"rank": 100
},
{
"title": "EMQ X 的百萬連接壓力測試的場景是什么?",
"category": "運維管理",
"tag": ["性能測試"],
"content": "在EMQ 2.0版本發(fā)布的時候,由第三方軟件測試工具服務提供商 [XMeter](https://www.xmeter.net) 執(zhí)行了一次百萬級別連接的性能測試。...",
"rank": 98
}
]
}
使用前
很長一段時間里我在 Node.js 中采用 JavaScript 的數組查找、過濾和排序來完成數據篩選,在數據變更之后使用寫文件的方式再次寫入磁盤。
const { faq } = require('./datasource.json')
// 過濾
const deployFAQ = faq.filter($ => $.category === '運維管理')
// 以下還有排序代碼...
基于如此復雜且不清晰的操作流,我多次思考糾結我是否需要一個數據庫來處理這部分業(yè)務,哪怕是 SQLite 都行,但是引入數據庫后我又不得不再開發(fā)一個 Admin 界面來進行增刪查改。
使用后
const low = require('lowdb')
const FileSync = require('lowdb/adapters/FileSync')
const adapter = new FileSync('db.json')
const db = low(adapter)
db.defaults({ faq: [] })
.write()
// Filter and Sort by rank.
const faq = db.get('faq')
.filter({ category: '運維管理' })
.sortBy('rank')
.value()
console.log(faq)
項目計劃
文章首發(fā)
物聯(lián)網 IoT 應用集成、前端倒騰 W I v 的博客 https://wivwiv.com