使用IndexedDB打开两个Web应用程序(Electron)示例

qc6wkl3g  于 2022-12-09  发布在  IndexedDB
关注(0)|答案(4)|浏览(372)

在我的基于Electron的Web应用程序中,我使用了IndexedDB。如果我将整个项目复制到一个单独的目录中,并在原始副本运行时运行它,IndexedDB API会抱怨它无法打开数据库。只有关闭第一个应用程序,第二个应用程序才能正常运行。
这就提出了IndexedDB如何处理文件的问题,这个问题仍然存在。电子使用文件协议来访问url。IndexedDB如何处理不使用文件协议而是使用http/https的普通web应用程序?显然,每个应用程序都有自己的数据库,并且可以访问它而不与其他数据库冲突。那么,为什么基于文件的web应用程序的行为会不同呢?我可以做些什么来使我的应用程序的两个副本都能与单独的indexedDB数据库一起工作吗?

lf5gs5x2

lf5gs5x21#

这个thread提到了一个可能的HTML5 localStorage解决方案:
顺便说一句,我能够启动应用程序的2个示例,每个示例加载存储在localStorage中的不同设置,我的方法是使用不同的域启动每个示例,例如localhost上的不同端口-因此每个示例都接收不同的localStorage。
这可能也是IndexedDB的发展方向...

koaltpgm

koaltpgm2#

电子的正确解决方案是用途:
setPath(“用户数据”,[某个路径]);
这需要在主进程中运行,并且应该是在创建任何窗口或其他任何操作之前首先要做的事情之一。请参见:
https://github.com/electron/electron/blob/master/docs/api/app.md
任何文件或缓存数据都将存储在使用setPath定义的路径下。

roejwanj

roejwanj3#

在浏览器中运行应用程序时不会发生此问题。问题出在Electron,而不是浏览器。此外,可以同时运行两个不同的Excectorn应用程序,只要它们使用不同的IndexedDB数据库名称即可。
无法针对同一个IndexedDB同时运行两个Electron应用程序,因为IndexedDb将被第一个应用程序/示例锁定。
从文档来看,这似乎可以通过在初始化应用程序时调用“app.setPath(name,path)”来避免。但是,这会导致两个不同的IndexedDB数据库,包含不同的数据。此外,这将导致LocalStorage开始重复。如果您只是临时存储数据,那么此解决方案可能适用于您。

polhcujo

polhcujo4#

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

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

相关问题