在IndexedDB中使用嵌套对象属性作为索引
我的应用使用IndexedDB来存储通过File System Access API打开的文件。FileSystemFileHandles会被保存在数据库中,以便用户返回应用时重新打开。
我正在尝试将句柄的 name 属性用作存储的索引,但这并不起作用。索引的创建方式如下:
store.createIndex("handle.name", "handle.name", { unique: true });
不过该索引中没有任何记录(这是存储本身,只有一个条目显示一个带有name属性的句柄):

然而,索引中什么也没有:

如果在数据库中存储的顶层对象上显式添加一个 "name" 属性,并在插入前从 handle.name 设置该属性,我就能让索引工作,但我想避免这种重复。根据我所读到的,这个索引应该是可行的。
解决方案
这不起作用,因为 name 在 FileSystemFileHandle 上是一个getter而不是字段。
更具体地说,根据 规范,它不是键路径值的有效属性:
Key path 值只能从通过 StructuredSerializeForStorage 显式复制的属性访问,以及以下类型特定属性:
Type Properties Blob 大小、类型 File 名称、最后修改时间 Array 长度 String 长度
因此,如果你想在 handle.name 上设置索引,或者把从句柄获取的File存储并放在 File.name 上,你就需要你找到的变通方法,但那很可能不是你想要的。
那么,为什么在DevTools中检查时仍然能看到名称?
IndexedDB在将对象插入数据库时会使用 structuredClone。FileSystemFileHandle 是 structuredClone 算法所支持的 [Web/API类型] 之一,因此它的原型会被保留,你会看到这个被求值的getter。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。