升级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
相关产品推荐
相关产品推荐

