IndexedDB中的密钥路径无效:限制?

Bai*_*Dev 6 javascript key-value-store indexeddb

我正在尝试使用一些JavaScript创建一个非常简单的IndexedDB,但它已经在on处理程序中失败了.显然,浏览器(Chrome 57)无法解析keyPath(在基本概念我的存储设备).

我或多或少地关注这些简单的例子:MDNOpera-Dev.

假设我想在DB中存储像这样的对象:

{
    "1": 23, // the unique id
    "2": 'Name',
    "3": 'Description',
    "4": null,
    "5": null
}
Run Code Online (Sandbox Code Playgroud)

这是代码:

var sStoreNodes = 'nodes';
var sIdFieldNode = '1'; // the important part

// event is fired for creating the DB and upgrading the version
request.onupgradeneeded = function(event)
{
    var db = event.target.result;

    // Create an objectStore for nodes. Unique key should be the id of the node, on property 1. 
    // So ID will be the key!
    var objectStore =  db.createObjectStore(
        sStoreNodes,
        {
            // changing to a plain string works, if it is a valid identifier and not just a strigified number
            'keyPath'       : [ sIdFieldNode ],
            'autoIncrement' : false // really important here
        });
};
Run Code Online (Sandbox Code Playgroud)

错误消息如下:

未捕获的DOMException:无法在"IDBDatabase"上执行"createObjectStore":keyPath选项不是有效的密钥路径.在IDBOpenDBRequest.CCapIndexedDB.request.onupgradeneeded

我也可以尝试省略关键路径,但我想知道为什么会发生这种情况,并且如果我真的需要使用(复杂的)密钥路径,我希望我能做些什么.

关于规格:

我不确定,是否适用于此:

如果值是以下ECMAScript [ECMA-262]类型之一,则称该值为有效密钥:Number原始值,String原始值,Date对象或Array对象.

实际意味着什么:

如果密钥路径是DOMString,则[用于获取密钥路径]的值将是等于密钥路径的DOMString.如果键路径是一个序列,则该值将是一个新的Array,通过在序列中附加等于每个DOMString的Strings来填充.


编辑如果您不使用字符串编号,而是使用字符串,这是有效的标识符(以字符[a-zA-Z]开头),则此方法有效.所以'keyPath' : 'b'没关系.我想这是因为这个值用于创建路径a.b.c.

dum*_*ter 6

这是来自规范的关键路径的定义:

键路径是定义如何从值中提取键的 DOMString 或序列。有效的密钥路径是以下之一:

  • 一个空的 DOMString。
  • 一个标识符,它是一个 DOMString 匹配来自 ECMAScript 语言规范 [ECMA-262] 的 IdentifierName 产品。
  • 一个 DOMString 由两个或多个用句点分隔的标识符组成(ASCII 字符代码 46)。
  • 一个仅包含符合上述要求的 DOMStrings 的非空序列。

对于包含整数的字符串,显然第一个、第三个和第四个选项不适用。其次,我们必须看看IdentifierName 是什么,这有点复杂,但基本上它必须以字母、下划线或美元符号开头。这意味着仅包含整数的字符串不是有效的键路径。

如果您确实有一个对象,其中主键位于名称为包含整数的字符串的字段中,您可以重命名该字段或不使用键路径(在这种情况下,您必须手动将键指定为第二个参数到IDBObjectStore.addIDBObjectStore.put)。

您链接到key 的定义,它定义了一个键可以具有的有效值(例如对于一个{a: 1}键路径是'a'键 is的对象1,这是有效的)。

您链接另一件事是关于关键路径,如a.b.c引用{a: {b: {c: 1}}}