dexie - таблица<tableName> не является частью транзакции

Я работаю над простым приложением для построения дерева из узлов. У меня есть следующие настройки хуков, чтобы при удалении узла из дерева удалялись все дочерние узлы, а также удалялись все ассоциации для этих узлов. Я использую следующий код, чтобы попытаться создать такое поведение:

      // delete node hook
      db.nodes.hook('deleting', function(key, record, transaction){
        // after deleting a node, go delete its associations 
        this.onsuccess = function(){
          console.log(transaction);
          transaction.links.where('node').equals(record.id).delete();
        };
      });
      // delete link hook
      db.links.hook('deleting', function(key, record, transaction){
        // start delete cascade to prevent dead entries
        this.onsuccess = function(){
          transaction.nodes.where('id').equals(record.child).delete();
        };
      });

И это дает мне эту ошибку "Необработанный отказ: NotFoundError: Табличные ссылки не являются частью транзакции". Я зарегистрировал объект транзакции, чтобы проверить это, а также заглянул в исходный код, чтобы узнать, откуда эта ошибка, и похоже, что это storeNames. Моя база данных имеет следующую структуру:

  db.version(1).stores({
    nodes : '++id, title, content',
    links : '&[node+child], node, child'
  });

но я вижу "узлы" только когда заглядываю в storeNames. Я использую Dexie версии 2 бета 10 - и это вполне может быть проблемой, но я не уверен, потому что это мой первый проект indexeddb, и мне порекомендовали dexie. Я пошел с бета-версией, потому что все руководства использовали синтаксис для 2.x.

Любое понимание будет с благодарностью!

- короткая задержка - я только что попробовал это снова с последней версией 1.x, и теперь я получил эту ошибку: "Необработанный отказ: Ошибка: не удалось выполнить" objectStore "для" IDBTransaction ": указанное хранилище объектов не найдено."

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

--edit: Оказывается, я мог бы решить эту проблему, используя блок транзакции и выполнив свое удаление оттуда после включения обеих таблиц в транзакцию. Проблема заключалась в том, что транзакция, использованная в коде хука, который я здесь написал, не знает ни о каких таблицах, кроме тех, которые задействованы в транзакции.

0 ответов

Чтобы завершить ответ автора примером кода, вы можете исправить проблему, добавив таблицу 'links' в оператор, в котором создается транзакция, переданная в качестве параметра в метод hook. Это утверждение не показано в вопросе, но оно должно выглядеть примерно так...

db.transaction('rw', db.nodes, function () { ... }

Если это так, исправленный код будет...

db.transaction('rw', db.nodes, db.links, function () { ... }
Другие вопросы по тегам