Неверный ключевой путь в IndexedDB: ограничения?

Я пытаюсь создать действительно простую IndexedDB с некоторым JavaScript, но он уже терпит неудачу в обработчике on. По-видимому, браузер (Chrome 57) не может разобрать keyPathОсновные понятия) моего хранилища.

Я следую более или менее этим простым примерам: MDN или Opera-Dev.

Предположим, я хочу хранить такие объекты в БД:

{
    "1": 23, // the unique id
    "2": 'Name',
    "3": 'Description',
    "4": null,
    "5": null
}

Вот код:

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
        });
};

Сообщение об ошибке выглядит так:

Uncaught DOMException: не удалось выполнить «createObjectStore» для «IDBDatabase»: параметр keyPath не является допустимым путем к ключу. в IDBOpenDBRequest.CCapIndexedDB.request.onupgradeneeded

Я также могу попытаться пропустить ключевой путь, но мне интересно, почему это происходит, и хочу ли я что-то с этим сделать, если мне действительно нужно использовать (сложный) ключевой путь.

Относительно спецификации:

Я не уверен, можно ли здесь применить это:

Значение считается допустимым ключом, если оно относится к одному из следующих типов ECMAScript [ECMA-262]: числовое примитивное значение, строковое примитивное значение, объект Date или объект Array.

и что на самом деле означает это:

Если ключевой путь является DOMString, значение [для получения ключевого пути] будет DOMString, равным ключевому пути. Если ключевой путь представляет собой последовательность, значением будет новый массив, заполненный добавлением строк, равных каждой DOMString в последовательности.


Изменить Это работает, если вы используете не строковое число, а строку, которая является допустимым идентификатором (начинается с символа [a-zA-Z]). Так что 'keyPath' : 'b' в порядке. Я думаю, это потому, что это значение используется для создания путей, таких как a.b.c.


person BairDev    schedule 07.04.2017    source источник


Ответы (1)


Вот определение ключевого пути из спецификации:

Ключевой путь — это DOMString или последовательность, которая определяет, как извлечь ключ из значения. Допустимый ключевой путь является одним из:

  • Пустая DOMString.
  • Идентификатор, представляющий собой DOMString, соответствующий продукции IdentifierName из Спецификации языка ECMAScript [ECMA-262].
  • DOMString, состоящий из двух или более идентификаторов, разделенных точками (код символа ASCII 46).
  • Непустая последовательность, содержащая только строки DOMString, соответствующие приведенным выше требованиям.

Очевидно, что для строки, содержащей целое число, первый, третий и четвертый варианты неприменимы. Во-вторых, мы должны увидеть что такое IdentifierName, что немного сложный, но в основном он должен начинаться с буквы, подчеркивания или знака доллара. Это означает, что строка, содержащая только целое число, не является допустимым путем к ключу.

Если у вас действительно есть объект, в котором первичный ключ находится в поле, имя которого представляет собой строку, содержащую целое число, вы можете либо переименовать поле, либо не использовать ключевые пути (в этом случае вам нужно вручную указать ключ в качестве второго аргумента). до IDBObjectStore.add и IDBObjectStore.put).

Вы связались с определением ключа, который определяет действительный значения, которые может иметь ключ (например, для объекта {a: 1}, где путь к ключу — 'a', ключ — 1, что допустимо).

другая вещь, на которую вы ссылались, касается ключевых путей, таких как a.b.c ссылки {a: {b: {c: 1}}}.

person dumbmatter    schedule 07.04.2017