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”(另一个文件)。如何解决这个问题?