'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 的错误处理或避免多重注册。
欢迎提出改进意见。
我正在使用 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 的错误处理或避免多重注册。
欢迎提出改进意见。