无提示错误“UpgradeError 尚不支持更改主键”

问题描述 投票:0回答:1

我不知道在 Dexie 中无法更改主键,它给了我这个错误:

UpgradeError Not yet support for changing primary key

但我的主要问题是这个错误在 useLiveQuery() 中是无声的:

  useLiveQuery(
   () => db.tournaments.limit(5).reverse().toArray(),
   [],
    "loading",
  );

  useEffect(() => {
    window.addEventListener("unhandledrejection", (event) => {
      console.error(event); // This doesn't work. no error event
    });
  }, []);


由于它是无声的,所以除非我在每个

ErrorBoundary
中捕获此错误,否则无法触发我的自定义
useLiveQuery()

useLiveQuery(
    () => {
        try{
          db.tournaments.limit(5).reverse().toArray()
        }catch(e){
          throw new Error("DB error")
        }
     }
    [],
    "loading",
  );


我认为这个错误是在 dexie.js 的第 1274 行中捕获的:

       Table.prototype._trans = function (mode, fn, writeLocked) {
            var trans = this._tx || PSD.trans;
            var tableName = this.name;
            var task = debug && typeof console !== 'undefined' && console.createTask && console.createTask("Dexie: ".concat(mode === 'readonly' ? 'read' : 'write', " ").concat(this.name));
            function checkTableInTransaction(resolve, reject, trans) {
                if (!trans.schema[tableName])
                    throw new exceptions.NotFound("Table " + tableName + " not part of transaction");
                return fn(trans.idbtrans, trans);
            }
            var wasRootExec = beginMicroTickScope();
            try {
                var p = trans && trans.db._novip === this.db._novip ?
                    trans === PSD.trans ?
                        trans._promise(mode, checkTableInTransaction, writeLocked) :
                        newScope(function () { return trans._promise(mode, checkTableInTransaction, writeLocked); }, { trans: trans, transless: PSD.transless || PSD }) :
                    tempTransaction(this.db, mode, [this.name], checkTableInTransaction);
                if (task) {
                    p._consoleTask = task;
                    p = p.catch(function (err) {
                        console.trace(err); <<<===== HERE
                        return rejection(err);
                    });
                }
                return p;
            }
            finally {
                if (wasRootExec)
                    endMicroTickScope();
            }
        };

enter image description here

这个 DatabaseClosedError 错误应该在

useLiveQuery()
中保持沉默吗?

javascript typescript indexeddb dexie
1个回答
0
投票

第一次执行任何 Dexie 查询时,它将需要打开数据库,除非应用程序已经这样做了。在打开数据库期间,会将版本和架构与设备上的持久数据库进行比较。在这种情况下,架构在创建后似乎已更改,并且更改涉及更改主键属性,这是不支持的。

如果您想在应用程序中更早地捕获 UpgradeError,请在应用程序引导代码中显式调用

await db.open()
(不一定在 React 组件中)。

如果应用程序尚未发布,只需转到 devtools --> 应用程序选项卡 --> IndexedDB 并删除数据库,您的问题就会消失。

另一方面,如果您尝试更改主键并且已经有用户安装了以前版本的数据库,则可能需要更改表名称,请参阅https://github.com/dexie/Dexie。 js/issues/646#issuecomment-359755452

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.