我正在集成一个使用IndexedDB的javascript库,但当Firefox处于隐私浏览/窗口模式时,它会“无意义地”失败。该库返回500内部错误,同时Firefox向控制台吐出InvalidStateError。
我想要做的是在实例化此库之前添加一个检查,如果IndexedDB不可用,则根本不使用该库。即某种类型的尝试/捕获测试。从我所看到的情况来看,Firefox似乎吐出了控制台错误,即使有问题的代码在try / catch中(但也许还有办法......)。
我实际上并不关心用户是否在私有窗口会话中,但这似乎是Firefox导致此InvalidStateError的唯一时间。
答案 0 :(得分:0)
我使用indexedDB检查用户是否处于隐私浏览模式。在window.onerror上出现InvalidStateError并通过跟踪系统记录。 看起来开放发生在不同的线程中。我发现只有这个原始解决方案:设置全局处理程序window.onerror,以隐藏此错误。
// Get old handler (maybe undefined)
const oldHandler = window.onerror;
// Empty handler
const noop = () => 1;
window.onerror = noop;
const returnOldHandler = () => setTimeout(() => {
// The ugly thing: we some external code could place own onerror handler
// between our code evaluation.
// For this case we should check is it changed.
if (window.onerror === noop) {
window.onerror = oldHandler;
}
}, 0);
try {
db = window.indexedDB.open('test');
// Return global handler when DB opens.
// It can create some errors due async process.
db.onerror = returnOldHandler;
db.onsuccess = returnOldHandler;
} catch(e) {
// never evaluate
}
答案 1 :(得分:0)
你已经处理了onerror函数中的错误。
这不会告诉你明确的使用是"在私人",但会告诉你你不能使用indexedDB - 你可以根据需要插入 - 即如果它的FireFox和它的抛出和错误,那么他们很可能是私人的 - 直到Mozilla的人解决它。
node.sources = my-source
node.channels = my-channel
node.sinks = my-sink
# Since node 1 sink is avro-type, here we indicate avro as source type
node.sources.my-source.type = avro
node.sources.my-source.bind = 0.0.0.0
node.sources.my-source.port = 11112
node.sources.my-source.channels = my-channel
node.channels.my-channel.type = memory
node.channels.my-channel.capacity = 10000
node.channels.my-channel.transactionCapacity = 100
node.sinks.my-sink.type = logger
node.sinks.my-sink.channel = my-channel
node.sinks.my-sink.maxBytesToLog = 256
这仍然会向控制台发出InvalidStateError,但是js可以处理后果。