Electron集成discord.js发送图片报REQ_RESOURCE_TYPE错误如何解决?
问题根因
该报错由Electron与discord.js的Buffer实例兼容性问题导致:Electron运行环境(跨IPC传输后的数据、上下文隔离开启的渲染进程)中生成的Buffer实例,不属于Node.js原生Buffer构造函数的实例,而discord.js的文件校验逻辑使用instanceof Buffer做类型判断,因此校验失败抛出错误。
可行解决方案
- 方案1:统一在主进程运行discord.js逻辑
所有bot相关操作、消息发送逻辑全部放在Electron主进程执行,渲染进程仅通过IPC通道向主进程发送触发指令、接收日志回传即可,无需拆分双进程,从根源避免Buffer实例不一致问题。 - 方案2:强制转换为原生Buffer实例
拿到图片数据后,在主进程中用Buffer.from()重新包装,确保传给discord.js的是主进程原生Buffer实例:// imgData为渲染进程IPC传入的Uint8Array或Electron环境生成的Buffer const validImgBuffer = Buffer.from(imgData) // 发送消息示例 channel.send({ embeds: [embed], files: [{ attachment: validImgBuffer, name: 'stats.png' }] }) - 方案3:直接传入本地文件绝对路径
如果PNG已保存到本地磁盘,无需读取为Buffer,直接传入文件系统绝对路径字符串即可绕过Buffer校验:const path = require('path') const { app } = require('electron') // 注意不要使用带app://等自定义协议的路径,必须是真实磁盘路径 const imgPath = path.resolve(app.getAppPath(), './output/stats.png') channel.send({ embeds: [embed], files: [imgPath] }) - 方案4:使用Base64 Data URI传递
也可将PNG转换为标准Data URI字符串传入,同样可以绕过Buffer校验:const imgDataURI = `data:image/png;base64,${pngBase64Content}` channel.send({ embeds: [embed], files: [imgDataURI] })
内容的提问来源于stack exchange,提问作者gonzalinux
相关产品推荐
相关产品推荐

