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

Electron中ipcMain.handle传递Model参数报错及解决方法

问题解决:Electron ipcMain 报错 "Expected handler to be a function, but found type 'object'"

错误原因

你当前写法ipcMain.handle('user:create', saveData(User))是直接调用了saveData(User),而saveData是async函数,调用后会返回一个Promise对象,但ipcMain.handle要求第二个参数必须是函数,不是对象,因此触发该错误。另外你的saveData参数顺序也不符合ipcMain handler的规范(handler第一个参数应为event,后续才是传入的数据)。

两种修复方案

方案一:用闭包生成对应Model的handler函数

这是最直观的复用方式,通过工厂函数提前绑定Model,返回符合ipcMain要求的handler:

const User = require('../database/models/Users.js');
// 传入User模型,生成对应的handler函数
ipcMain.handle('user:create', createDataHandler(User));

// 工厂函数:接收Model,返回ipcMain需要的handler
function createDataHandler(Model) {
  return async (_, data) => {
    try {
      const result = await Model.insert(data);
      return result;
    } catch (e) {
      console.log(e.message);
      // 把错误抛给渲染进程,方便前端处理
      throw e;
    }
  };
}

后续新增其他Model时,直接复用该工厂函数即可:

const Employee = require('../database/models/Employee.js');
ipcMain.handle('employee:create', createDataHandler(Employee));

方案二:用bind调整参数顺序绑定Model

如果不想额外编写工厂函数,可以调整saveData的参数顺序,用bind把Model提前绑定:

const User = require('../database/models/Users.js');
// 用bind把User作为第一个参数绑定,ipcMain的event和data会自动往后排列
ipcMain.handle('user:create', saveData.bind(null, User));

async function saveData(Model, _, data) {
  try {
    const result = await Model.insert(data);
    return result;
  } catch (e) {
    console.log(e.message);
    throw e;
  }
}

额外提醒

catch块里最好把错误抛回给渲染进程,否则前端调用ipcRenderer.invoke会一直处于pending状态,无法感知错误发生。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 01:50:25