在我的基于Electron的网络应用程序中,我使用了IndexedDB。如果我将整个项目复制到一个单独的目录并在原始副本运行时运行它,则IndexedDB API会抱怨它无法打开数据库。只有关闭第一个应用程序,第二个应用程序才能正常运行。
这引发了关于IndexedDB如何处理文件的问题。即使我给每个数据库自己的名字,问题仍然存在。 Electron使用文件协议访问URL。 IndexedDB如何处理不使用文件协议而非http / https的普通网络应用程序?显然,每个应用程序都有自己的数据库,可以访问它而不会与其他数据库冲突。那么为什么基于文件的Web应用程序的行为会有所不同?有什么办法可以让我的应用程序的两个副本都使用单独的indexedDB数据库吗?
答案 0 :(得分:0)
此thread提到HTML5 localStorage可能solution:
BTW,我能够在其中启动2个应用程序实例的方式 每个加载存储在localStorage中的不同设置,就是要启动 每个都有不同的域,例如localhost上的另一个端口 - 因此每个人都会收到不同的localStorage。
这也可能是IndexedDB的方法......
答案 1 :(得分:0)
Electron的正确解决方案是使用:
setPath(“userData”,[some path]);
这需要在主进程中运行,并且应该是在创建任何窗口之前完成的第一件事之一或者其他任何事情。参见:
https://github.com/electron/electron/blob/master/docs/api/app.md
任何文件或缓存数据都将存储在您使用setPath定义的路径下。
答案 2 :(得分:0)
在浏览器中运行应用程序时不会发生此问题。问题出在Electron,而不是浏览器。另外,只要它们使用不同的IndexedDB数据库名称,就可以同时运行两个不同的Exlectorn应用程序。
无法针对同一个IndexedDB同时运行两个Electron应用程序,因为IndexedDb将被第一个应用程序/实例锁定。
从文档中看来,可以通过在初始化应用程序时调用“ app.setPath(name,path)”来绕过此问题。但是,这导致两个不同的IndexedDB数据库包含不同的数据。同样,这将导致LocalStorage开始重复。如果您仅临时存储数据,则此解决方案可能对您有用。
答案 3 :(得分:0)
我找到了一个解决方案,您需要在 partition
中使用属性 webPerferences
,例如:
const mainWindow = new BrowserWindow({
width: 800,
height: 600,
webPreferences: {
preload: path.join(__dirname, 'preload.js'),
partition: `persist:${new Date().getTime()}`
}
})