Electron使用ffi-napi报错External buffers are not allowed解决办法

报错如下:UnhandledPromiseRejectionWarning: Error: External buffers are not allowed

这是由于Electron的高版本已经不支持外部缓冲区,而ffi-napi在使用的过程中会创建外部缓冲区,这两个是冲突的。

如图,在nodejs的官方文档里提到过Electron不支持:https://nodejs.cn/api/v18/n-api/napi_create_external_arraybuffer.html

可以看到Electron v20版本以后就不支持了,具体不支持的原因可以看官方给出的本篇考量文章:https://www.electronjs.org/zh/blog/v8-memory-cage

评论区对这个改动意见很大,多人发表看法:https://github.com/electron/electron/issues/35801,用户表示只要升级了Electron版本,之前的扩展都不能用了,对用户的再次改造增加了很多工作量,希望官方解除不能创建外部缓冲区的禁锢,但是到目前为止,Electron官网基于安全性以及内存泄漏问题考虑,一直是禁止创建外部缓冲区,所以会报错。

然后我试了很多办法,比如在顶部加入NODE_API_NO_EXTERNAL_BUFFERS_ALLOWED,或者把malloc改为copy,这些都是在之前的文档里找到的解决办法。但是目前我用的"electron": "38.4.0"还是会报错,无法解决。

还有一种办法是让我把Electron的版本降到v20,但是由于我的项目是基于Electron搭建的,而且考虑到降低版本会不会导致里边的部分功能不完善,比如我的代码里调用了新版的函数,但是旧版没有。思考过后觉得降低Electron版本要改动的地方应该也不少,所以就没有尝试降低版本这一建议。

最终在评论区 (https://github.com/node-ffi-napi/node-ffi-napi/issues/238) 找到办法,弃用了 ffi-napi 改为了Koffi

Koffi官网:https://koffi.dev/,里边介绍Koffi是ffi的延伸,也是为了去调用本地的dll,并且因为没有创建外部缓冲区,所以不会报错。

完全卸载了ffi-napi相关的包以及调用代码,并且安装了Koffi进行重写代码,确实不会报External buffers are not allowed这个错误了。

反思:网上的很多教程比如使用ffi-napi,在几年前是可以使用的,但是随着搭配组件的的更新,比如说Electron的更新,就会导致里边的功能有冲突。所以在使用工具的时候,最好是新版对新版,旧版对旧版,才可以减少错误。

相关推荐
牛奶38 分钟前
2026年大模型怎么选?前端人实用对比
前端·人工智能·ai编程
牛奶40 分钟前
前端人为什么要学AI?
前端·人工智能·ai编程
Kagol3 小时前
🎉OpenTiny NEXT-SDK 重磅发布:四步把你的前端应用变成智能应用!
前端·开源·agent
GIS之路4 小时前
ArcGIS Pro 中的 notebook 初识
前端
JavaGuide4 小时前
7 道 RAG 基础概念知识点/面试题总结
前端·后端
ssshooter5 小时前
看完就懂 useSyncExternalStore
前端·javascript·react.js
格砸5 小时前
从入门到辞职|从ChatGPT到OpenClaw,跟上智能时代的进化
前端·人工智能·后端
Live000006 小时前
在鸿蒙中使用 Repeat 渲染嵌套列表,修改内层列表的一个元素,页面不会更新
前端·javascript·react native
柳杉6 小时前
使用Ai从零开发智慧水利态势感知大屏(开源)
前端·javascript·数据可视化