博客主页瑕疵的CSDN主页 Gitee主页瑕疵的gitee主页⏩ 文章专栏《热点资讯》IndexedDB用得懵数据存不了目录IndexedDB用得懵数据存不了凌晨三点用户数据存不进去。控制台蹦出个报错InvalidStateError: Failed to execute put on IDBObjectStore: The transaction is finished.我盯着代码想砸键盘。问题存数据直接崩看这段代码明明逻辑对吧// 错误示例事务没处理constdbawaitopenDB(app-db,1);consttxdb.transaction(users,readwrite);conststoretx.objectStore(users);// 直接存没等事务结束store.put({id:1,name:小明});// 报错控制台直接甩出InvalidStateError。坑爹啊数据存不进去前端还不能哭。核心根源事务早结束了IndexedDB的事务是状态机。你创建了事务tx但没等它完成就操作。上面的代码store.put()执行后事务立刻结束因为没监听事件所以后面的操作全挂了。正确写法等事务完成// 正确示例用 request 监听constdbawaitopenDB(app-db,1);consttxdb.transaction(users,readwrite);conststoretx.objectStore(users);// 1. 用 put 返回的 requestconstrequeststore.put({id:1,name:小明});// 2. 监听操作成功request.onsuccess(){console.log(数据存进去了);// 这里才真存好// 3. 等事务结束tx.oncomplete()console.log(事务完成);};关键点store.put()返回IDBRequest必须用onsuccess监听别在put()后直接写新操作事务没结束对比代码错误写法正确写法store.put(...)直接调用不处理返回const req store.put(...)req.onsuccess事务没等待直接结束事务在tx.oncomplete触发后才真正结束避坑总结所有操作必须监听onsuccessput()/add()/delete()都返回request别直接塞进代码里不监听等于没存。事务结束要等oncompletetx.oncomplete是事务真正结束的标志别提前关事务比如在onsuccess里tx.abort()。用 async/await 封装避免回调地狱写成这样更清爽asyncfunctionsaveUser(user){constdbawaitopenDB(app-db,1);consttxdb.transaction(users,readwrite);conststoretx.objectStore(users);awaitstore.put(user);// 等待存入完成tx.oncomplete()console.log(存成功);}上个月被这问题折磨到秃头。同事说“你代码写得对啊”结果一查——他忘了加onsuccess和我一样懵。IndexedDB不是SQL别拿关系型数据库思维套。存数据前先问自己事务结束了吗别让凌晨三点的报错再成为你的日常。