我的项目是一个中型的电子应用程序,我使用承诺-mysql到达后端。虽然有关于如何用电子连接到MySQL的几个好例子,但我发现没有一个使用连接池。
我正在使用的数据库服务器是非常小的(a NUC),因此我希望使用一个连接池来限制事情。在我看来,实例化连接池的自然位置应该在电子的main.js文件中,就在应用程序启动窗口之前。这是为了让所有渲染者都能找到它。为了获得和释放连接,我编写了如下ipc处理程序:
// MySQL setup
const ipc = require('electron').ipcMain;
var mysql = require('promise-mysql');
var mysqlParms = require("./mysqlConfig.json");
let cfMySQLPool = mysql.createPool({
host: mysqlParms.host,
user: mysqlParms.user,
password: mysqlParms.password,
database: mysqlParms.database,
multipleStatements: true,
connectionLimit: 4 // NUC is a small box
});
ipc.on('getCFConnection', function (event, arg) {
event.sender.send('cfConnection', cfMySQLPool.getConnection()); // send a connection Promise
})
ipc.on('releaseCFConnection', function (event, cfConnection) {
cfMySQLPool.releaseConnection(cfConnection); // release the connection from the pool
})然而,这是失败的。呈现者没有收到getConnection()的承诺,我想我找到了原因。当event.sender.send (即webcontents.send)传递参数时,docs状态:
“参数将在JSON内部序列化,因此不包含任何函数或原型链。”
因此,.then()的能力--呈现器中的getConnection承诺--似乎被JSON序列化剥夺了。
有没有人可以提供在电子中实现承诺-mysql连接池的解决方案,以便任何呈现器都可以在其上调用getConnection / releaseConnection?谢谢。
发布于 2017-04-27 06:01:24
虽然这个是对“如何实现.”问题的回答,但我当然希望并希望我的答案不会被接受。我会坚持一段时间,看看你们中的一个智者会不会想出更好的办法。
但是实现承诺的一种方法-- MySQL连接池,就是简单地“让步”,不仅让电子的main.js实例化这个池,而且让main.js运行所有的MySQL进程承诺。
在呈现器方面,只需要一个IPCRenderer请求就可以启动该进程。然后,Main.js通过运行承诺链本身来响应。下面是一个简单的ping:
// process 1: ping MySQL server to see if its up; oParms not used
ipc.on('_mp1', function (event, oParms) {
let localConn = null;
cfMySQLPool.getConnection().then((conn) => {
localConn = conn;
localConn.ping((err) => {
cfMySQLPool.releaseConnection(localConn);
if (err) {
event.sender.send("mp1_", {error: null, result: false});
} else {
event.sender.send("mp1_", {error: null, result: true});
}
})
.catch((err) => {
event.sender.send("mp1_", {error: err, result: null});
});
});
});来自query()方法的结果(它的返回只是一个结果字段数据数组)不受电子内部JSON序列化的影响;没有函数/原型可以去掉。将连接释放回池并将数据发送到请求呈现程序是很容易的,并且完成了这个过程。
因此,事后看来,这个问题实际上不是关于承诺-mysql真的,而是关于为什么电子不能通过IPC将功能完好无损的“富”对象传递给呈现器。结果的工作实现使许多不必要的IPC处理。
除非有人有不同的看法.?
https://stackoverflow.com/questions/43642903
复制相似问题