You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级node-persist后同步方法失效,求异步getItem/setItem实现方案

解决node-persist升级后的异步读写方案及JSON解析报错问题

你遇到的SyntaxError: Unexpected end of JSON input报错,大概率是升级node-persist后同步API行为变更,导致读写操作未完全完成就执行后续逻辑,最终拿到不完整的加密数据,解密后无法正常解析JSON。既然必须升级,我们把所有相关逻辑改成异步版本,用async/await确保操作的顺序性和完整性。

改造后的异步实现方案

首先将getAccounts和saveAccounts改为异步函数,使用node-persist的getItem()和setItem()方法,并通过await等待操作完成:

// 异步版本的getAccounts
async function getAccounts(masterPassword) {
  // 等待异步读取操作完成
  const encryptedAccount = await storage.getItem('accounts');
  let accounts = [];
  
  // 仅读取到有效数据时才进行解密和解析
  if (typeof encryptedAccount !== 'undefined' && encryptedAccount) {
    try {
      const bytes = crypto.AES.decrypt(encryptedAccount, masterPassword);
      const decryptedStr = bytes.toString(crypto.enc.Utf8);
      // 额外判断解密后的字符串有效性,避免空字符串触发JSON解析错误
      if (decryptedStr) {
        accounts = JSON.parse(decryptedStr);
      }
    } catch (decryptError) {
      throw new Error('解密或解析账户数据失败: ' + decryptError.message);
    }
  }
  
  return accounts;
}

// 异步版本的saveAccounts
async function saveAccounts(accounts, masterPassword) {
  try {
    // 加密账户数据
    const encryptedAccounts = crypto.AES.encrypt(JSON.stringify(accounts), masterPassword);
    // 等待异步写入操作完成
    await storage.setItem('accounts', encryptedAccounts.toString());
    return accounts;
  } catch (encryptError) {
    throw new Error('加密或保存账户数据失败: ' + encryptError.message);
  }
}

接着,createAccount函数也需要改为异步函数,因为它内部调用了两个异步方法:

async function createAccount(account, masterPassword) {
  // 等待账户数据读取完成
  const accounts = await getAccounts(masterPassword);
  accounts.push(account);
  // 等待账户数据保存完成
  await saveAccounts(accounts, masterPassword);
  return account;
}

最后调整调用逻辑,确保在异步环境中执行:

// 将调用逻辑包裹在async函数中
async function runCreateAccount() {
  try {
    const createdAccount = await createAccount(
      { username: argv.username, password: argv.password }, 
      argv.masterPassword
    );
    console.log('Account created!');
    console.log(createdAccount);
  } catch (e) {
    console.log('Unable to create account.');
    console.error(e);
  }
}

// 执行异步函数
runCreateAccount();

关键注意点

  • 所有node-persist读写操作必须用await等待完成,确保数据读写的完整性
  • 在解密和JSON解析环节增加错误捕获,避免单个步骤失败导致整个流程崩溃
  • 额外判断解密后的字符串是否为空,防止空字符串传入JSON.parse引发报错

内容的提问来源于stack exchange,提问作者JeanCarlos Chavarria

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 03:48:49