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的更新,就会导致里边的功能有冲突。所以在使用工具的时候,最好是新版对新版,旧版对旧版,才可以减少错误。

相关推荐
之歆1 小时前
Day07_CSS盒子模型 · 样式继承 · 用户代理样式
前端·css
01漫游者1 小时前
JavaScript函数与对象增强知识
开发语言·javascript·ecmascript
DanCheOo1 小时前
AI 应用的安全架构:Prompt 注入、数据泄露、权限边界
前端·人工智能·prompt·安全架构
We་ct2 小时前
深度剖析浏览器跨域问题
开发语言·前端·浏览器·跨域·cors·同源·浏览器跨域
weixin_427771613 小时前
前端调试隐藏元素
前端
threelab3 小时前
Three.js 代码云效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能
爱上好庆祝4 小时前
学习js的第五天
前端·css·学习·html·css3·js
C澒4 小时前
IntelliPro 产研协作平台:基于 AI Agent 的低代码智能化配置方案设计与实现
前端·低代码·ai编程
一袋米扛几楼984 小时前
【Git】规范化协作:详解 GitHub 工作流中的 Issue、Branch 与 Pull Request 最佳实践
前端·git·github·issue
网络点点滴4 小时前
前端与后端的区别与联系
前端