IndexedDB在Vue中打开失败,报错“InvalidStateError”是怎么回事?
我在Vue组件里尝试用IndexedDB存点用户配置,但一调用indexedDB.open()就报“InvalidStateError: Failed to execute ‘open’ on ‘IDBFactory’”。明明之前在普通JS里能跑,放到Vue里就不行了,是不是哪里初始化顺序有问题?
我试过把代码放在mounted里,也检查过数据库名和版本号,还是不行。下面是我写的简单示例:
<script setup>
import { onMounted } from 'vue'
onMounted(() => {
const request = indexedDB.open('myAppDB', 1)
request.onerror = () => console.error('DB open failed')
request.onsuccess = (event) => {
const db = event.target.result
console.log('DB opened:', db)
}
})
</script>
InvalidStateError这个报错,大概率是浏览器环境的问题。你先检查几个点:
第一,确认是不是在无痕模式或者隐私模式下跑的。很多浏览器在隐私模式下会把IndexedDB给禁掉,直接抛这个错误。普通JS能跑可能是因为那时候你没开隐私模式。
第二,看看浏览器是不是禁用了第三方存储。有些浏览器设置或者扩展会拦截IndexedDB。
第三,如果你的项目用了SSR(服务端渲染),那服务端根本没有indexedDB这个对象,也会报错。不过看你的代码是放在onMounted里的,理论上应该是在客户端执行才对。
我建议你加个环境检测和错误捕获,这样排查起来更清楚:
顺便说一句,你最好把数据库连接封装成一个独立的模块,用钩子函数管理连接生命周期,不然每个组件都去open一次也挺蛋疼的。我之前在WordPress里搞PWA的时候,都是单独写一个db.js来管理IndexedDB实例,哪里要用直接import进来就行。
你先试试上面这个改法,控制台应该能看到更具体的错误信息。如果还是不行,把完整的错误堆栈贴出来看看。