Node.js 在ElectronJS(asar)中编写JSON文件 问题

Node.js 在ElectronJS(asar)中编写JSON文件 问题,node.js,json,electron,fs,electron-packager,Node.js,Json,Electron,Fs,Electron Packager,FrameWork-ElectronJS 我的程序使用.json文件保存用户输入的数据。在开发环境中,这些文件编写得非常完美,但是在使用electron-packager打包后,JSON文件不再编写,这完全使我的程序无效 我主要使用那些JSON文件来编写程序,因此完全删除它们将再次从头开始编写程序。有没有一种方法可以让程序像在dev环境中那样在客户端PC中编写JSON文件 示例程序 这只是一个示例程序,但我所有的代码都是这种格式 //JavaScript //This Javascript

FrameWork-ElectronJS

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

我主要使用那些
JSON
文件来编写程序,因此完全删除它们将再次从头开始编写程序。有没有一种方法可以让程序像在dev环境中那样在客户端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"
}

包装代码与标准完全相同

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

**如何做到这一点**

注意:我没有在程序中的任何地方使用ipcRenderer()。

使现代化 我发现
asar
是只读文件

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


如果解释太多,请向您表示感谢和歉意。

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

是您正在寻找的函数

然后做一些类似的事情:

fs.writeFileSync(app.getPath(“appData”)+“/auth.json”,元素);
或者更好,使用:

fs.writeFileSync(path.join(app.getPath(“appData”),“auth.json”),元素);

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

是您正在寻找的函数

然后做一些类似的事情:

fs.writeFileSync(app.getPath(“appData”)+“/auth.json”,元素);
或者更好,使用:

fs.writeFileSync(path.join(app.getPath(“appData”),“auth.json”),元素);

谢谢你,谢谢你。然而,我似乎遇到了另一个问题,
let{app}=require('electron')
…再次
let test=app.getPath(“appData”)
然后我控制台日志测试。但是,这给了我一个错误
TypeError:无法读取未定义的属性“getPath”
@SubhankarChowdhury自从接受了答案以来,您现在已经解决了这个问题了吗?一些可能性:您是否在主进程中运行?您确定从
require
获取的
app
变量仍在函数的作用域中(是否为同一文件等)?你有没有可能重新定义了这个变量?
console.log(app)
有效吗?是的,谢谢。我用在internet上找到的
appdata路径模块
替换了
app.getPath()
,现在它工作得很好。谢谢大家!@AurelBílý,我在使用
app.getPath()
对象时遇到问题。我有一个js文件,它是根据与HTML的交互从事件中调用的,但是当它被加载时,应用程序对象是未定义的。const{app}=require('electron')用于文件顶部,也用于“main.js”(另一个文件)。如何解决这个问题?谢谢你。然而,我似乎遇到了另一个问题,
let{app}=require('electron')
…再次
let test=app.getPath(“appData”)
然后我控制台日志测试。但是,这给了我一个错误
TypeError:无法读取未定义的属性“getPath”
@SubhankarChowdhury自从接受了答案以来,您现在已经解决了这个问题了吗?一些可能性:您是否在主进程中运行?您确定从
require
获取的
app
变量仍在函数的作用域中(是否为同一文件等)?你有没有可能重新定义了这个变量?
console.log(app)
有效吗?是的,谢谢。我用在internet上找到的
appdata路径模块
替换了
app.getPath()
,现在它工作得很好。谢谢大家!@AurelBílý,我在使用
app.getPath()
对象时遇到问题。我有一个js文件,它是根据与HTML的交互从事件中调用的,但是当它被加载时,应用程序对象是未定义的。const{app}=require('electron')用于文件顶部,也用于“main.js”(另一个文件)。如何解决这个问题?