lowdb更新JSON文件异常:仅primary_autorization_date字段变更
从你贴的代码和日志来看,这个问题有点反常:你明明在代码里更新了access_token、expires_in等字段,但最终JSON文件里只有未被你操作的primary_autorization_date变了,目标字段完全没更新。我来帮你拆解可能的原因和解决办法:
1. 先排查tokens变量的初始化是否正确
LowDB的set方法是作用在当前指向的数据库节点上的,如果你的tokens变量没有直接指向数据库的根对象,那你的更新操作根本没落到你期望的位置。
举个例子,如果你的初始化代码是这样的:
const tokens = db.get('auth.subPath') // 指向根对象下的某个子节点
但你的JSON文件里所有字段都是根级的(比如access_token直接在最外层),那你调用set('access_token', ...)其实是在修改auth.subPath.access_token,而非根对象的access_token,自然不会更新到你看到的JSON文件里。
解决办法:确保tokens直接指向数据库根节点,比如:
const tokens = db // 直接操作根对象
如果你的token字段确实在某个子节点下,一定要保证读取和写入的路径完全一致。
2. 检查是否有其他代码在修改primary_autorization_date
你的代码里完全没有对primary_autorization_date做任何操作,但这个字段却发生了变更——这说明肯定有其他逻辑在同时读写这个JSON文件。比如:
- 是否有定时器、其他异步请求在同一时间更新该字段?
- 是否有其他模块也在操作这个文件,导致写入冲突?
解决办法:
- 全局搜索代码库,找到所有修改
primary_autorization_date的地方,确认执行顺序是否会覆盖你的token更新操作; - 如果是并发写入冲突,建议给LowDB的写入操作加个简单的锁,或者确保同一时间只有一个写入动作在执行。
3. 修正Moment对象的序列化问题
你代码里直接把moment()对象写入数据库,LowDB在序列化Moment对象时可能会出现异常,导致写入不完整或者失败。
解决办法:把Moment对象转成标准的ISO日期字符串后再写入:
.set('refresh_date', moment().toISOString())
4. 验证写入前后的数据库状态
你代码里打印了final和tokens.value(),但要重点确认:
- 调用
write()之前,tokens.value()是否已经包含了新的token值?如果没有,说明你的set操作根本没生效,回到第一步排查tokens的指向; - 如果
tokens.value()是正确的,但写入文件后不对,那问题可能出在LowDB的写入机制或者文件系统层面,你可以尝试简化代码直接用根对象写入测试:
// 替换原来的链式调用,直接操作根对象 db.set('access_token', final.access_token) .set('expires_in', final.expires_in) .set('refresh_token', final.refresh_token) .set('refresh_date', moment().toISOString()) .write() // 写入后立即读取验证 console.log('写入后的数据库内容:', db.value())
如果这样能正确更新所有字段,那基本可以确定是之前的tokens变量初始化有问题。
内容的提问来源于stack exchange,提问作者dolor3sh4ze

