localforage结合IndexedDB时键值异常转换问题:如何将MySQL交易记录ID作为正确键名存储?
解决localforage存储键名异常转换的问题
其实你遇到的这个“键名被转成其他进制”的情况,是个常见的小误会,不是代码逻辑出了大问题,我来给你拆解下:
问题根源
当你把纯数字的字符串(比如"1"、"2")传给localforage的setItem作为键时,localforage会自动尝试把这个字符串解析成数值类型存储。而Chrome DevTools在展示IndexedDB的数值型键时,会同时显示十进制和十六进制形式(比如数字10会显示成10 (0xa)),这就造成了“键被异常转换”的错觉,但实际上数据本身是没问题的。
解决方案
要让localforage严格使用字符串类型的键(也就是你期望的"1"、"2"...形式),最直接可靠的办法是给键名添加一个非数字的前缀,彻底避免localforage自动转换键的类型:
修改你的代码中生成id的部分:
id = "txn-" + String(tmp.id); // 或者用ES6模板字符串更简洁: // id = `txn-${tmp.id}`;
这样存储的键就会是txn-1、txn-2...这类明确的字符串,DevTools里也会正常显示,不会再出现进制转换的显示问题。
代码优化建议
另外,你可以用forEach替代传统for循环,代码更简洁,还能避免潜在的闭包问题:
const json = JSON.parse(data); json.transactions.forEach(tmp => { const id = `txn-${tmp.id}`; // 用解构赋值删除id属性,比delete更优雅 const { id: _, ...transactionData } = tmp; transactions.setItem(id, transactionData) .catch(err => console.log(err)); });
内容的提问来源于stack exchange,提问作者femto-code
相关产品推荐
相关产品推荐

