我正在尝试通过IndexedDB为长媒体录制实现Blob存储。
我的代码在Chrome和Edge上运行良好(还没有在Safari上测试)--但是在Firefox上什么都做不了。没有错误,只是在初始数据库连接(成功)之后,它没有尝试满足我的请求。直觉上,似乎处理被什么东西阻塞了。但是我的代码中没有任何东西会阻塞。
代码的简化版本(没有大量的日志记录和过多的错误检查,我已经添加了尝试调试):
const dbName = 'recording'
const storeValue = 'blobs'
let connection = null
const handler = window.indexedDB || window.mozIndexedDB || window.webkitIndexedDB
function connect() {
return new Promise((resolve, reject) => {
const request = handler.open(dbName)
request.onupgradeneeded = (event) => {
const db = event.target.result
if (db.objectStoreNames.contains(storeValue)) {
db.deleteObjectStore(storeValue)
}
db.createObjectStore(storeValue, {
keyPath: 'id',
autoIncrement: true,
})
}
request.onerror = () => {
reject()
}
request.onsuccess = () => {
connection = request.result
connection.onerror = () => {
connection = null
}
connection.onclose = () => {
connection = null
}
resolve()
}
})
}
async function saveChunk(chunk) {
if (!connection) await connect()
return new Promise((resolve, reject) => {
const store = connection.transaction(
storeValue,
'readwrite'
).objectStore(storeValue)
const req = store.add(chunk)
req.onsuccess = () => {
console.warn('DONE!') // Fires in Chrome and Edge - not in Firefox
resolve(req.result)
}
req.onerror = () => {
reject()
}
req.transaction.oncomplete = () => {
console.warn('DONE!') // Fires in Chrome and Edge - not in Firefox
}
})
}
// ... on blob available
await saveChunk(blob)
到目前为止,我尝试了:
- 关闭任何其他浏览器窗口,任何可视为“打开连接”的窗口,这些窗口可能会阻止执行
- 刷新Firefox配置文件
- 让我的同事在他自己的机器上测试代码=〉相同的结果
可能有用的其他信息:在Nuxt 2.15.8开发环境(localhost:3000)中运行。代码在组件中作为Mixin使用。该项目相当大,使用了一堆不同的浏览器API。可能会有某种冲突?!尽管这是我们使用IndexedDB的唯一地方,所以要在不抛出任何错误的情况下深入了解这一点几乎是不可能的。
编辑:
当我创建一个全新的数据库时,会有一个短暂的窗口,在此窗口中事务正常完成,但经过一段时间后/触发了某个事件后,事务又回到无限期排队的状态。
今天早上我发现了这个结构:
...
clearDatabase() {
// get the store
const req = store.clear()
req.transaction.oncomplete = () => console.log('all good!')
}
await this.connect()
await this.clearDatabase()
激发了“All good”。但任何后续请求都像以前一样被中断。在页面重新加载时,甚至clearDatabase
请求也再次被中断。
使用过程中出现故障。
编辑2:
很明显,这与使用autoIncrement选项保存没有id
的Blob示例有关。它不仅会默默地失败,而且基本上会完全损坏数据库。如果我手动为Blob对象分配一个递增的ID,它就会工作!如果我为一个普通的简单对象省略id
字段,它也可以工作!有人知道这个吗?我觉得保存斑点是一个常见的用例,所以这应该已经发现了?!
1条答案
按热度按时间bjp0bcyl1#
我的结论是,除非证明不是这样,否则这是一个Firefox bug和opened a ticket on Bugzilla。
这种情况发生在Blob上,但也可能发生在其他示例上。如果你发现自己处于同样的情况,有一个解决办法。不要依赖
autoIncrement
,在尝试将ID保存到DB之前手动分配ID。