尝试保存autoIncremented Blob后,IndexedDB在Firefox中中断

jm2pwxwz  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(1)|浏览(167)

我正在尝试通过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字段,它也可以工作!有人知道这个吗?我觉得保存斑点是一个常见的用例,所以这应该已经发现了?!

bjp0bcyl

bjp0bcyl1#

我的结论是,除非证明不是这样,否则这是一个Firefox bug和opened a ticket on Bugzilla
这种情况发生在Blob上,但也可能发生在其他示例上。如果你发现自己处于同样的情况,有一个解决办法。不要依赖autoIncrement,在尝试将ID保存到DB之前手动分配ID。

相关问题