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

Electron集成Prisma操作本地SQLite数据库遇到两类问题求助

Electron+Angular+Prisma集成解决方案

两个问题的根本原因是你混淆了Electron的进程边界:PrismaClient仅支持Node.js环境,而你将其直接引入了属于浏览器环境的Angular渲染进程代码中,既触发了Prisma的浏览器运行限制,也导致webpack打包渲染进程代码时找不到Node核心模块的polyfill。

正确集成步骤

1. 调整Prisma调用位置

所有Prisma相关的数据库操作必须放在Electron主进程中执行,主进程拥有完整的Node.js运行权限,不存在浏览器环境限制。

// 主进程 main.ts
import { PrismaClient } from '@prisma/client';
import { ipcMain, app } from 'electron';
import * as path from 'path';

// 初始化Prisma客户端
const prisma = new PrismaClient({
  datasources: {
    db: {
      // 适配打包后SQLite数据库文件的存储路径
      url: `file:${path.join(app.getPath('userData'), 'app.db')}`
    }
  }
});

// 注册IPC事件监听,接收渲染进程的数据库操作请求
ipcMain.handle('testTable:create', async (_, value: string) => {
  return await prisma.testTable.create({
    data: { value }
  });
});

2. 渲染进程通过IPC调用数据库能力

Angular前端代码完全不要引入Prisma相关依赖,通过预加载脚本暴露的IPC方法和主进程通信,既符合安全规范也不会触发webpack的polyfill报错。

  • 首先配置主进程窗口参数,开启预加载脚本:
// 主进程创建窗口的配置项
const mainWindow = new BrowserWindow({
  width: 800,
  height: 600,
  webPreferences: {
    contextIsolation: true, // 开启安全隔离,不建议关闭
    nodeIntegration: false, // 关闭渲染进程的Node权限,符合安全规范
    preload: path.join(__dirname, 'preload.js')
  }
})
  • 编写预加载脚本preload.js,暴露IPC方法给渲染进程:
const { contextBridge, ipcRenderer } = require('electron');

contextBridge.exposeInMainWorld('electronAPI', {
  createTestItem: (value: string) => ipcRenderer.invoke('testTable:create', value)
});
  • 调整Angular组件代码,通过暴露的API触发数据库操作:
// home.component.ts
// 声明全局API类型
declare global {
  interface Window {
    electronAPI: {
      createTestItem: (value: string) => Promise<{id: number; value: string}>
    }
  }
}

async onSqlTestAction(): Promise<void> {
  const newTestObject = await window.electronAPI.createTestItem("TestValue");
  console.log('数据创建成功', newTestObject);
}

3. 适配打包配置

  • 在prisma/schema.prisma中指定Windows平台的二进制目标,避免打包后缺失查询引擎:
generator client {
  provider = "prisma-client-js"
  binaryTargets = ["windows"]
}

datasource db {
  provider = "sqlite"
  url      = "file:./app.db"
}
  • 打包主进程时将@prisma/client标记为外置依赖,不要打包进主进程bundle,直接将相关文件复制到输出目录即可,避免路径解析错误。
    你之前尝试的方案针对的是主进程打包时的二进制缺失问题,和你的场景不符,按上述流程调整后两个问题都会同步解决。

内容的提问来源于stack exchange,提问作者Ruik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 15:36:02