'The "path" argument must be of type string. Received null' 电子-json-存储

'The "path" argument must be of type string. Received null' in electron-json-storage

我正在使用 eletron-json-这样的存储:

settings.js:

  const storage = require('electron-json-storage'); 
  const defaultStoragePath = storage.getDefaultDataPath(); 
  // Value: C:\Users467\AppData\Roaming\maplateditor\storage

  ...

  defaultStorage() {
    console.log("Check defaultStorage value");
    console.log(defaultStoragePath); 
    // C:\Users467\AppData\Roaming\maplateditor\storage
    storage.setDataPath(defaultStoragePath);
    console.log(storage.getDataPath());
    // C:\Users467\AppData\Roaming\maplateditor\storage
    return storage;
  }

  ...

  this.defaultStorage().get(...)

而且我每次都检查变量 defaultStoragePath 是否已设置。

但是电子-json-存储导致错误:

(anonymous) @ VM75 renderer_init.js:93
VM75 renderer_init.js:93 TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string. Received null
    at validateString (VM19 validators.js:124)
    at Object.resolve (VM28 path.js:139)
    at mkdirP (VM113 F:\github\MaplatEditor\node_modules\mkdirp\index.js:25)
    at VM91 F:\github\MaplatEditor\node_modules\electron-json-storage\lib\storage.js:527
    at nextTask (VM93 F:\github\MaplatEditor\node_modules\async\dist\async.js:5327)
    at next (VM93 F:\github\MaplatEditor\node_modules\async\dist\async.js:5334)
    at VM93 F:\github\MaplatEditor\node_modules\async\dist\async.js:972
    at VM91 F:\github\MaplatEditor\node_modules\electron-json-storage\lib\storage.js:524
    at nextTask (VM93 F:\github\MaplatEditor\node_modules\async\dist\async.js:5327)
    at Object.waterfall (VM93 F:\github\MaplatEditor\node_modules\async\dist\async.js:5337)

这是一个错误吗?
我怎样才能避免这种情况?

环境是:

node.js: 16.13.1
电子:13.6.6
电子-json-存储:4.5.0

=== 附加信息:
电子未发生此错误:11.5.0

我的代码在 electron: 11.5.0 和 electron: 13.6.6 之间的区别是:

在电子 11.5.0 上:通过以下方式调用 settings.js 代码:

  const settings = require('electron').remote.require('./settings').init();

在electron 13.6.6上:通过preload.js调用settings.js代码:

  window.settingsBackend = require('./settings');

也许这种差异会导致不同的结果..

终于找到原因了...

我在“preload.js”中调用了“electron-json-storage”。
我不知道“preload.js”在渲染器进程中工作。
我必须在主进程上使用 electron-json-storage。

我意识到在contextIsolation环境下,我需要从nodeIntegration时代的配置上彻底重新思考我的架构。

====

我为将来有类似问题的人创建了在 contextIsolation 环境下使用 electron-json-storage 的示例: https://gist.github.com/kochizufan/a467c6b76390c6f1c41260614cb06a5c

这个效果很好。
注意:此示例中完全省略了 api 的错误处理或避免多重注册。

欢迎提出改进意见。