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 () { ... }