使用IndexedDB打开两个web app(Electron)实例

使用IndexedDB打开两个web app(Electron)实例,electron,indexeddb,Electron,Indexeddb,在我基于Electron的web应用程序中,我使用IndexedDB。如果我将整个项目复制到一个单独的目录,并在原始副本运行时运行它,IndexedDB API会抱怨它无法打开数据库。只有关闭第一个应用程序,第二个应用程序才能正常运行 这就提出了IndexedDB如何处理文件的问题。即使我给每个数据库指定了自己的名称,问题仍然存在。Electron使用文件协议访问URL。IndexedDB如何处理不使用文件协议而使用http/https的普通web应用程序?显然,每个应用程序都有自己的数据库,可

在我基于Electron的web应用程序中,我使用IndexedDB。如果我将整个项目复制到一个单独的目录,并在原始副本运行时运行它,IndexedDB API会抱怨它无法打开数据库。只有关闭第一个应用程序,第二个应用程序才能正常运行

这就提出了IndexedDB如何处理文件的问题。即使我给每个数据库指定了自己的名称,问题仍然存在。Electron使用文件协议访问URL。IndexedDB如何处理不使用文件协议而使用http/https的普通web应用程序?显然,每个应用程序都有自己的数据库,可以访问它而不会与其他数据库发生冲突。那么,为什么基于文件的web应用程序的行为会有所不同呢?我能做些什么使我的应用程序的两个副本都能与单独的indexedDB数据库一起工作吗?

这提到了HTML5本地存储的一种可能:

顺便说一句,我能够启动应用程序的两个实例,其中 每个加载存储在localStorage中的不同设置,然后启动 每个都具有不同的域,例如本地主机上的不同端口- 因此,每个接收不同的本地存储


这可能也是IndexedDB的发展方向

电子的正确解决方案是:

setPath(“userData”,[some path])

这需要在主进程中运行,并且应该是在创建任何窗口或执行任何其他操作之前首先要做的事情之一。见:


任何文件或缓存数据都将存储在使用setPath定义的路径下。

在浏览器中运行应用程序时,不会出现此问题。问题在于Electron,而不是浏览器。此外,还可以同时运行两个不同的Exlectorn应用程序,只要它们使用不同的IndexedDB数据库名称

无法针对同一IndexedDB同时运行两个Electron应用程序,因为IndexedDB将被第一个应用程序/实例锁定


从文档中可以看出,在初始化应用程序时调用“app.setPath(name,path)”似乎可以避免这种情况。但是,这会导致两个不同的IndexedDB数据库,其中包含不同的数据。此外,这将导致本地存储开始重复。如果您仅临时存储数据,则此解决方案可能适合您。

我找到了一个解决方案,您需要在
webPerferences
中使用attribute
partition
,例如:

  const mainWindow = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, 'preload.js'),
      partition: `persist:${new Date().getTime()}`
    }
  })