Electron JS中通用MySQL类的创建与渲染进程复用方法
实现通用数据库操作类并在渲染进程复用
1. 创建数据库工具类
在项目中新建db.js文件,封装MySQL连接与常用操作,推荐用连接池管理连接(比单次连接更高效,自动复用连接):
// db.js const mysql = require('mysql'); // 创建连接池 const pool = mysql.createPool({ host: 'localhost', user: 'root', password: null, database: '你的数据库名' // 替换为实际数据库名称 }); // 封装通用Promise化查询方法 const query = (sql, params) => { return new Promise((resolve, reject) => { pool.query(sql, params, (err, results) => { if (err) reject(err); else resolve(results); }); }); }; // 封装用户相关业务操作 const UserDB = { // 检查用户是否存在 async checkExists(apiId) { const results = await query('SELECT count(*) as total FROM users WHERE api_id = ?', [apiId]); return results[0].total > 0; }, // 插入新用户 async insert(apiId, name, pin) { await query('INSERT INTO users (api_id, name, pin_code) VALUES (?, ?, ?)', [apiId, name, pin]); } }; module.exports = { query, UserDB };
2. 通过预加载脚本暴露API到渲染进程
新版本Electron默认开启上下文隔离,渲染进程无法直接加载Node模块,需通过预加载脚本(preload.js)向渲染进程安全暴露API:
// preload.js const { contextBridge } = require('electron'); const { UserDB } = require('./db.js'); // 向渲染进程的window对象注入安全API contextBridge.exposeInMainWorld('electronDB', { user: { checkExists: UserDB.checkExists, insert: UserDB.insert } });
3. 主进程配置预加载脚本
在主进程(main.js)的窗口配置中指定预加载脚本路径:
// main.js const { app, BrowserWindow } = require('electron'); const path = require('path'); function createWindow() { const mainWindow = new BrowserWindow({ width: 800, height: 600, webPreferences: { contextIsolation: true, // 保持默认开启的上下文隔离,提升安全性 preload: path.join(__dirname, 'preload.js') // 指定预加载脚本路径 } }); mainWindow.loadFile('index.html'); } app.whenReady().then(createWindow); app.on('window-all-closed', () => { if (process.platform !== 'darwin') app.quit(); }); app.on('activate', () => { if (BrowserWindow.getAllWindows().length === 0) createWindow(); });
4. 渲染进程中调用通用方法
现在可以在任意渲染文件中直接调用暴露的API,无需重复编写连接代码:
// 渲染进程中的示例代码 async function insertUser(id, name, pin) { try { const userExists = await window.electronDB.user.checkExists(id); if (!userExists) { await window.electronDB.user.insert(id, name, pin); console.log('用户插入成功'); } else { console.log('用户已存在'); } } catch (err) { console.error('数据库操作失败:', err); } }
关键注意事项
- 杜绝SQL注入:原代码用字符串拼接SQL的方式存在严重安全风险,示例中使用的参数化查询(
?占位符)是安全的标准写法,必须坚持使用。 - 安全优化建议:虽然上述方式可以在渲染进程调用API,但更安全的做法是将所有数据库操作放在主进程,通过IPC通信(
ipcMain/ipcRenderer)让渲染进程发起请求,避免渲染进程直接接触数据库凭证。
内容的提问来源于stack exchange,提问作者Mina Ezeet
相关产品推荐
相关产品推荐

