You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 04:27:05