在 ElectronJS (asar) 中编写 JSON 文件

Posted

技术标签:

【中文标题】在 ElectronJS (asar) 中编写 JSON 文件【英文标题】:Writing JSON files in ElectronJS (asar) 【发布时间】:2021-01-17 00:00:48 【问题描述】:

问题

FrameWork - ElectronJS

我的程序使用.json 文件来保存用户输入的数据。在开发环境中,这些文件写得很好,但是用electron-packager打包后,JSON文件不再写,这完全使我的程序无效。

我主要使用那些JSON 文件来编写我的程序,因此完全删除它们将再次从头开始执行程序。有没有办法让程序像在开发环境中一样在客户端 PC 中写入 JSON 文件。

示例程序

这只是一个示例程序,但我所有的代码都是这种格式。

//javascript 

//This Javascript catches user inputs and send them to jsonWriter function


document.getElementById("save").addEventListener('click', async function(e) 
  e.preventDefault()

  var userData = document.getElementById('username').value
  var acctData = document.getElementById('account').value

  var formData = 
    username: userData,
    account: acctData
  ; // create JS object

  await writer.jsonLC(formData);
);


// This is my json Writer function

async function jsonForAuth(data)

    let element = JSON.stringify(data);
    fs.writeFileSync(__dirname + '\\data\\auth.json', element) 

//All my directory for 'fs' are written in such format with a '__dirname'



module.exports.jsonLC = jsonForAuth;

// All of this works perfectly on dev-environment (VS-Code)

现在我用electron-packager打包

// Here is my package.json for reference


  "name": "electron_app",
  "productName": "Test App",
  "version": "1.0.0",
  "description": "",
  "main": "main.js",
  "dependencies": 
    "asar": "^3.0.3",
    "axios": "^0.20.0",
    "fs-extra": "^9.0.1",
    "jwt-decode": "^3.0.0-beta.2",
    "keytar": "^6.0.1",
    "node-fetch": "^2.6.1",
    "puppeteer-core": "^5.3.0"
  ,
  "devDependencies": 
    "electron": "^10.1.2",
    "electron-packager": "^15.1.0"
  ,
  "scripts": 
    "start": "electron .",
    "package-mac": "electron-packager . --overwrite --platform=darwin --arch=x64 --icon=assets/icons/mac/icon.icns --prune=true --out=release-builds",
    "package-win": "electron-packager . electron_app --overwrite --asar --platform=win32 --arch=x64 --icon=assets/img/icons/win/icon.ico --prune=true --out=release-builds --version-string.CompanyName=CE --version-string.FileDescription=CE --version-string.ProductName=\"Test App\"",
    "package-linux": "electron-packager . electron-tutorial-app --overwrite --asar=true --platform=linux --arch=x64 --icon=assets/icons/png/1024x1024.png --prune=true --out=release-builds"
  ,
  "keywords": [],
  "author": "",
  "license": "ISC"


包装代码与This guide here完全相同。

结论

现在打包应用程序和一些不需要json files 的脚本后可以正常工作。但是现在上面的sample program 变得无用了,因为不再创建 json 文件。

** 如何完成这项工作? **

Note: I have NOT used ipcRenderer() anywhere in my program.

更新

我发现asar 是只读文件。

那么有没有办法将我的 json 保存位置更改为 Local/Appdata ?

谢谢,如果解释过大,请见谅。

【问题讨论】:

【参考方案1】:

是的,写入应用程序位置不是一个好主意,而且经常被禁止。使用通常用于应用程序设置等的 appdata 文件夹就足够了。

app.getPath(name) 是您要查找的函数。

然后执行以下操作:

fs.writeFileSync(app.getPath("appData") + "/auth.json", element);

或者甚至更好,使用path:

fs.writeFileSync(path.join(app.getPath("appData"), "auth.json"), element);

【讨论】:

谢谢你。但是我似乎遇到了另一个问题,let app = require('electron')....再次let test = app.getPath("appData") 然后我控制台日志测试。但是,这给了我这个错误TypeError: Cannot read property 'getPath' of undefined @SubhankarChowdhury 既然您接受了答案,那么您现在解决问题了吗?一些可能性:您是否在主进程中运行?您确定从require 获得的app 变量仍在函数的范围内(是同一个文件等)吗?你有机会重新定义变量吗? console.log(app) 有效吗? 好的,谢谢。我用在互联网上找到的appdata-path module 替换了app.getPath(),现在它可以正常工作了。谢谢! @AurelBílý,我在使用 app.getPath() 对象时遇到问题。我有一个 js 文件,它根据与 html 的交互从事件中调用,但是当它被加载时,app 对象是 undefinedconst app = require('electron') 用在文件的顶部,也用在 'main.js'(不同的文件)中。如何解决?

以上是关于在 ElectronJS (asar) 中编写 JSON 文件的主要内容,如果未能解决你的问题,请参考以下文章

将电子应用程序打包在 asar 中时使用 require

在 ASAR 中找不到 PNG 文件

如何在 ElectronJS 中打印 DIV

探秘app.asar

探秘app.asar

探秘app.asar