3

ノードからツリーを構築する単純なアプリケーションに取り組んでいます。ノードがツリーから削除されると、すべての子ノードが削除され、それらのノードのすべての関連付けも削除されるように、次のフックが設定されています。次のコードを使用して、この動作を試して作成しています。

      // 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 リリースでこれを再試行したところ、次のエラーが表示されました。 "

では、リリースもベータ版もフックを削除できませんか? それとも、何か間違ったことをしただけですか? 私はこれに従いました。ご覧のとおり、私のフックコードはそこに提供されている例に基づいています。ストアの直後とオープンプロミス内にフックを設定しようとしましたが、何もうまくいかないようです。データベース全体を数回スキャンして、最終的にルートに接続しないノードを見つけるよりも、カスケード削除のようなものを使用したいと思います (笑)。

--edit: トランザクション ブロックを使用し、トランザクションに両方のテーブルを含めた後、そこから削除を実行することで、この問題を解決できることがわかりました。問題は、ここで書いたフック コードで使用されているトランザクションが、トランザクションに関係するテーブル以外のテーブルを認識していないことです。

4

1 に答える 1