首页 程序笔记 本地JSON数据库lowdb使用方法

本地JSON数据库lowdb使用方法

数据库对于在 Node.js 应用程序中持久保存数据至关重要。 根据应用程序的不同,开发者可以采用最多样化的实现,而 Node.js lowdb 是重量级数据库的一个精简替代品,而其也是本文的主角。

数据库的共同点是开发者必须安装数据库软件并运行服务器进程。 然而,在某些情况下,这意味着不必要的大量开销。 特别是如果开发者只是想快速测试某些内容或者处于无法安装任何其他软件的环境中。

SQLite 是一种轻量级替代方案,是基于文件的 SQL 数据库。 但开发者依然必须编译数据库驱动程序。 为了避免这种情况,一个名为 lowdb 的数据库出现了。 lowdb 数据库基于 Lodash ,数据保存在 JSON 文件中。

注意:由于数据库以纯文本形式存储数据,因此根本无法达到成熟数据库的性能,成熟数据库通常以优化的二进制格式存储信息。 因此,不建议在生产操作中使用 lowdb。

什么是 lowdb

lowdb 是简单易用的类型安全的本地 JSON 数据库 ,具有以下突出优势:

非常轻量 极简主义者 支持 TypeScript 纯 JavaScript 安全原子写入 可破解:更改存储、文件格式(JSON、YAML...)或通过适配器添加加密,支持用 lodash、ramda 扩展 在测试期间自动切换到快速内存模式

当然,值得一提的是 Lowdb 不支持 Node 的 cluster 模块。

如果有大型 JavaScript 对象(~10-100MB)可能会遇到一些性能问题。 这是因为每当调用 db.write 时,整个 db.data 都会使用 JSON.stringify 序列化并写入存储。

当然,这也和具体用例有关系,可以通过执行批处理操作并仅在需要时调用 db.write 来缓解此问题。如要计划扩展,强烈建议使用 PostgreSQL 或 MongoDB 等数据库。

目前 lowdb 在 Github 通过 MIT 协议开源,有超过 20.5k 的 star、1k 的 fork、422k 的项目依赖量、是一个妥妥的前端优质开源项目。

如何使用 lowdb

Lowdb 是一个纯粹的 ESM 包,下面是基本使用方法:

import {JSONFilePreset} from 'lowdb/node'
// 读取或者创建 db.json
const defaultData = {posts: [] }
const db = await JSONFilePreset('db.json', defaultData)

// 更新 db.json
await db.update(({posts}) => posts.push('hello world'))

// 或者可以稍后显式调用 db.write()
// 写入 db.json
db.data.posts.push('hello world')
await db.write()

输出数据如下:

// db.json
{
  "posts": ["hello world"]
}

TypeScript 支持

可以使用 TypeScript 检查数据类型:

type Data = {
  messages: string[]
}

const defaultData: Data = {messages: [] }
const db = await JSONPreset<Data>('db.json', defaultData)

db.data.messages.push('foo')

db.data.messages.push(1)

Lodash 扩展

可以使用 Lodash(或其他库)扩展 lowdb。为了能够扩展它,在这里不使用 JSONPreset。相反,使用更加底层的组件。

import {Low} from 'lowdb'
import {JSONFile} from 'lowdb/node'
import lodash from 'lodash'

type Post = {
  id: number
  title: string
}
type Data = {
  posts: Post[]
}
// Extend Low class with a new `chain` field
class LowWithLodash<T> extends Low<T> {
  chain: lodash.ExpChain<this['data']> = lodash.chain(this).get('data')
}
const defaultData: Data = {
  posts: [],
}
const adapter = new JSONFile<Data>('db.json', defaultData)

const db = new LowWithLodash(adapter)
await db.read()

// Instead of db.data use db.chain to access lodash API
const post = db.chain.get('posts').find({ id: 1 }).value() // Important: value() must be called to execute chain

Lowdb adapters 适配器

JSONFile JSONFileSync

用于读取和写入 JSON 文件的适配器,用法也非常简单:

import {JSONFile, JSONFileSync} from 'lowdb/node'

new Low(new JSONFile(filename), {})
new LowSync(new JSONFileSync(filename), {})

Memory MemorySync

即内存适配器,对于加速单元测试很有用。

import {Memory, MemorySync} from 'lowdb'

new Low(new Memory(), {})
new LowSync(new MemorySync(), {})

LocalStorage SessionStorage

window.localStorage 和 window.sessionStorage 的同步适配器。

import {LocalStorage, SessionStorage} from 'lowdb/browser'
new LowSync(new LocalStorage(name), {})
new LowSync(new SessionStorage(name), {})

本文总结

本文主要和大家介绍 lowdb ,即一个简单易用的类型安全的本地 JSON 数据库。因为篇幅问题,关于 lowdb 只是做了一个简短的介绍,但是文末的参考资料提供了大量优秀文档以供学习,如果有兴趣可以自行阅读。如果大家有什么疑问欢迎在评论区留言。

参考资料

lowdb GitHub地址:https://github.com/typicode/lowdb

https://morioh.com/a/76cb8aa98844/lowdb-simple-to-use-local-json-database

https://headty.medium.com/building-a-crud-app-with-node-express-and-lowdb-beginner-cec2d5d1b65e

https://medium.com/@billys.moustakas/node-js-lowdb-a-lightweight-database-alternative-309583f555b2

https://www.youtube.com/watch?app=desktop&v=jeochJ-hUao

https://morioh.com/a/76cb8aa98844/lowdb-simple-to-use-local-json-database

https://dbdb.io/db/lowdb/revisions/3

3

站心网

数据库对于在 Node.js 应用程序中持久保存数据至关重要。 根据应用程序的不同,开发者可以采用最多样化的实..

为您推荐

PGlite:轻量级嵌入式PostgreSQL数据库使用方法

PGlite是一款基于PostgreSQL的轻量级嵌入式数据库,专为前端应用、无服务器环境和本地开发优化。与传统的PostgreSQL服务器相比,PGlite无需单独安装数据库服务,而是可以直接在应用程序内部运行,提供了一种更加灵活..

软件产品开发中常见的10个问题及处理方法

常见的10个问题#产品开发中常见的10个问题思维导图需求相关#1. 需求不明确#在日常工作中,需求来源于用户、老板、客户、竞品分析、业务部门、产品经理等,这些人或部门会提出需求,因为他们不是产品经理,提出的需求..

服务器安装数据库MySQL8.0版本,打包导入到MySQL5.6失败的结局方式

最近数据库升级为mysql8.0,在使用过程中发现一些问题,首先mysql8.0有很多新特性,对服务器配置要求较高,所有就考虑把数据库版本切换到MySQL5.6,经过多出测试处理发现在8.0数据库打包的数据导入到5.6总是报错,或..

在数据库中cms_content表content字段用SQL过滤替换掉包含photo.abc.tw所有图片img标签

SQL 语句:UPDATEcms_contentSETcontent=REGEXP_REPLACE(content,'<img[^>]*src="photo\\.abc\\.tw[^"]*"[^>]*>','')WHEREcontentREGEXP'<img[^>]*src="//photo\\.abc\\.tw';解释:REGEXP_R..

一个提升运营/营销转化率的万能方法!

之前,笔者有分享过说我最喜欢的增长是可复制可持续的增长,它一般都会有三个关键过程:首先是小范围测试,低成本试错,也就是最小可行性验证,让ROI最大化。然后是把测试的最优结果整理为可执行的标准化化流程。前..

实时数据的处理一致性如何保证?

实时数据一致性的定义以及面临的挑战数据一致性通常指的是数据在整个系统或多个系统中保持准确、可靠和同步的状态。在实时数据处理中,一致性包括但不限于数据的准确性、完整性、时效性和顺序性。下图是典型的实时/..

关于大数据的一些真知灼见

大数据很强大,但还是有很多人仍然不知道它到底是什么。让我们来学习大数据的真实表现,以及如何更好地促进企业转型。或许我们经常听到有人讲大数据,但仍然有很多人不知道它到底是什么。因为我确信它很强大,所以我..

学习最重要是方法,管理最重要是高度

技术学习要兼顾深度和广度夯实技术基础这么多年来,我面试了很多人。我越发感到「技术基础」非常重要。很多技术的本质是一样的。技术基础足够好的话,学东西可以非常快。往下到操作系统层面,甚至计算机硬件层面,你..

数据库SQL优化大总结之 百万级数据库优化方案

1.对查询进行优化,要尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from..

.net环境下跨进程、高频率读写数据

一、需求背景1、最近项目要求高频次地读写数据,数据量也不是很大,多表总共加起来在百万条上下。单表最大的也在25万左右,历史数据表因为不涉及所以不用考虑,难点在于这个规模的热点数据,变化非常频繁。数据来源..

JS 中彻底删除 JSON 对象组成的数组中的元素

在 JS 中,对于某个由 JSON 对象组成的数组,例如:var test = [{ "a": "1", "b": "2" }, { "a": "3", "b": "4" }, { "a": "5", "b": "6" }];如果我们想要删除其中的第二个json对象,应该怎么做呢?其实方法和操作数..

工作中人们常提到的数据预处理,说的到底是什么?

数据预处理一方面是为了提高数据的质量,另一方面也是为了适应所做数据分析的软件或者方法。在做数据分析时,我想许多数据分析师会像《R语言实战第二版》的作者卡巴科弗那样发出感叹:“数据分析师在数据预处理上花..

Java中String类常见的方法

以下介绍字符串常见的几个方法。介绍String类在 Java 中,String类是一个代表字符串的类,具有以下特性:不可变性:String对象一旦被创建就是不可变的,即它们的值在创建后不能被更改。任何对String对象的修改操作实..

2025年常见SQLServer数据库面试题

分享一些 2025年常见的 SQL Server 数据库面试题,涵盖基础知识、性能优化、高级查询、管理与运维等多个方面,适用于开发、DBA 及数据分析相关岗位的面试。1. SQL Server 的基本架构是什么?答案:SQL Server 的架构..

使用 html2canvas 实现截图功能

html2canvas 是一个开源的 JavaScript 库,用于将网页上的 HTML 元素渲染成图像。它通过遍历页面的 DOM 树和计算样式,然后将其绘制到 <canvas> 元素上,最终生成图片。该库不依赖服务器端,而是通过浏览器端的 Java..

使用SuperWebSocket实现Web消息推送

在大部分Web系统中,我们可能遇到需要向客户端推送消息的需求。SuperWebSocket第三方库能让我们轻松的完成任务。SuperWebSocket第三方库可以从网上下载,不过通过Visual Studio Nuget安装更快。引用SuperWebSocket相..

.NET C# 使用Hook钩子实现全局监听键盘和鼠标

C# 是一种面向对象的编程语言,具有丰富的类库和工具支持,适用于各种类型的应用程序开发。Windows 提供了一种称为"钩子"(Hook)的机制,允许拦截并处理系统级别的事件,如键盘按键和鼠标移动。通过结合 C# 和 Hook..

C#使用 Attribute 实现 AOP 功能

在 C# 中,通过自定义 Attribute 并结合一些技术(如动态代理、反射等)可以实现 AOP(面向切面编程)。AOP 通常用于日志记录、性能监控、权限验证等横切关注点。以下是一个使用 C# Attribute 实现 AOP 功能的示例。..

ABP.Net Core使用教程(一)启动模版项目

只需要简单的3步:1,到官网下载模版项目 https://aspnetboilerplate.com/Templates2,用VS2017打开,将Web.Host设置为启动项3,在程序包管理器控制台(Nuget控制台)里设定默认项目为EntityFrameworkCore,执行命令..

.net 通过 HttpClient 下载文件同时报告进度的方法

通过 HttpClient 的 ContentLength 很多时候都可以拿到下载的内容的长度,通过 ReadAsync 可以返回当前读到的长度,将读取到的长度加起来就是已经下载的长度看起来很简单,于是直接给代码private static async Task ..

发表回复

返回顶部