Electron部分(主进程部分)
可能涉及到的其他小问题
1.在package.json里面配置打包后目标文件应该储存的位置:
打包后目录结构会发生改变
"extraResources": [
{
"from": "./build/data.db",
"to": "app/src/"
}
],
2.node使用到的主要功能模块:
fs.readFile(...)//读
fs.writeFile(...)//写
3.序列化和反序列化:
//方法一
var serialize = require('node-serialize');
serialize.serialize(obj)//序列化
serialize.unserialize(str)//反序列化
//方法二
JSON.stringify()//序列化
JSON.parse()//反序列化
目标文件.json和.text类型均可
实现
读取
//读取本地文件
ipcMain.on('asynchronous-message-get', function (event) {
let urlName = 'asynchronous-reply-get'//消息发布-发布名称
// 传给渲染进程数据
fs.readFile(path.join(__dirname, "data.text"), "utf8", (err, data) => {
if (err) {
event.sender.send(urlName, 500, "读取失败");
} else {
event.sender.send(urlName, 200, data);
}
})
});
增改
//增改本地文件
ipcMain.on('asynchronous-message-set', function (event, key, value) {
let urlName = 'asynchronous-reply-set'//消息发布-发布名称
fs.readFile(path.join(__dirname, "data.text"), "utf8", (err, data) => {
if (err) {
event.sender.send(urlName, 500, "目标文件异常");
} else {
try {
//文件内json无法序列化的情况,使用空对象替换
let obj = new Object()
if (serialize.unserialize(data)) {
obj = serialize.unserialize(data)
}
obj[key] = value
let json = serialize.serialize(obj)
fs.writeFile(path.join(__dirname, "data.text"), json, "utf8", (err) => {
if (err) {
event.sender.send(urlName, 500, "写入失败");
} else {
event.sender.send(urlName, 200, "写入成功");
}
})
} catch (error) {
console.log(error);
//如果因为本地文件无法序列化而抛出错误,就直接重置数据叭(部分数据序列化后无法反序列化)
let json = serialize.serialize(new Object())
fs.writeFile(path.join(__dirname, "data.text"), json, "utf8", () => { })
}
}
})
});
删除
//删除本地文件json中的某一个键[和值]
ipcMain.on('asynchronous-message-del', function (event, key) {
let urlName = 'asynchronous-reply-del'//消息发布-发布名称
fs.readFile(path.join(__dirname, "data.text"), "utf8", (err, data) => {
if (err) {
event.sender.send(urlName, 500, "目标文件异常");
} else {
try {
//文件内json无法序列化的情况,抛出异常
if (serialize.unserialize(data)) {
let obj = serialize.unserialize(data)
if (obj[key]) {
delete obj[key]
}
let json = serialize.serialize(obj)
fs.writeFile(path.join(__dirname, "data.text"), json, "utf8", (err) => {
if (err) {
event.sender.send(urlName, 500, "删除失败");
} else {
event.sender.send(urlName, 200, "删除成功");
}
})
} else {
event.sender.send(urlName, 500, "目标文件异常");
}
} catch (error) {
console.log(error);
//如果因为本地文件无法序列化而抛出错误,就直接重置数据叭(部分数据序列化后无法反序列化)
let json = serialize.serialize(new Object())
fs.writeFile(path.join(__dirname, "data.text"), json, "utf8", () => { })
}
}
})
});
vue项目部分(渲染进程部分)
使用Promise进行封装,方便调用
//读取本地文件-向主进程发起请求--------------------------------------------------
async getJson() {
// 渲染进程->主进程
this.$electron.ipcRenderer.send("asynchronous-message-get");
return new Promise((req, rej) => {
// 主进程->渲染进程
this.$electron.ipcRenderer.on("asynchronous-reply-get", function(
event,
code,
arg
) {
setTimeout(rej, 3000);
if (code == 200) {
return req(arg);
} else if (code == 500) {
return rej(arg);
}
});
});
},
//增修本地文件-向主进程发起请求-------------------有则增,无则改-------------------------------
async setJson(key, value) {
// 渲染进程->主进程
this.$electron.ipcRenderer.send("asynchronous-message-set", key, value);
return new Promise((req, rej) => {
// 主进程->渲染进程
this.$electron.ipcRenderer.on("asynchronous-reply-set", function(
event,
code,
arg
) {
setTimeout(rej, 3000);
if (code == 200) {
return req(arg);
} else if (code == 500) {
return rej(arg);
}
});
});
},
//删除本地文件-向主进程发起请求--------------------------------------------------
async delJson(key) {
// 渲染进程->主进程
this.$electron.ipcRenderer.send("asynchronous-message-del", key);
return new Promise((req, rej) => {
// 主进程->渲染进程
this.$electron.ipcRenderer.on("asynchronous-reply-del", function(
event,
code,
arg
) {
setTimeout(rej, 3000);
if (code == 200) {
return req(arg);
} else if (code == 500) {
return rej(arg);
}
});
});
},
在vue项目中的调用
//读取本地文件---------------------------------------------------
getData() {
this.getJson()
.then(res => {
let data = JSON.parse(res);
})
.catch(err => {
console.log("err", err);
});
},
//修改本地文件---------------------------------------------------
setData(key, value) {
this.setJson(key, value)
.then(res => {})
.catch(err => {
console.log("err", err);
});
},
//删除本地文件---------------------------------------------------
delData(key) {
this.delJson(key)
.then(res => {})
.catch(err => {
console.log("err", err);
});
},