我不知道在 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();
}
};
这个 DatabaseClosedError 错误应该在
useLiveQuery()
中保持沉默吗?
第一次执行任何 Dexie 查询时,它将需要打开数据库,除非应用程序已经这样做了。在打开数据库期间,会将版本和架构与设备上的持久数据库进行比较。在这种情况下,架构在创建后似乎已更改,并且更改涉及更改主键属性,这是不支持的。
如果您想在应用程序中更早地捕获 UpgradeError,请在应用程序引导代码中显式调用
await db.open()
(不一定在 React 组件中)。
如果应用程序尚未发布,只需转到 devtools --> 应用程序选项卡 --> IndexedDB 并删除数据库,您的问题就会消失。
另一方面,如果您尝试更改主键并且已经有用户安装了以前版本的数据库,则可能需要更改表名称,请参阅https://github.com/dexie/Dexie。 js/issues/646#issuecomment-359755452