cmake 错误“无法读取属性'indexOf'的未定义”绑定n-api模块

ymzxtsji  于 5个月前  发布在  其他
关注(0)|答案(4)|浏览(76)

我用n-api写了一个c++模块,用cmake-js编译,现在想在我的electron-vue应用程序中使用它。如果我在没有electron-vue的项目中使用该模块,它就可以工作。但是当我试图在我的electron-vue应用程序中使用它时,我总是得到这个错误:

App threw an error during load
 TypeError: Cannot read property 'indexOf' of undefined
      at Function.getFileName (D:\temp\test2\node_modules\bindings\bindings.js:178:16)
      at bindings (D:\temp\test2\node_modules\bindings\bindings.js:82:48)
      at eval (webpack:///./src/main/index.js?:28:67)
      at Module../src/main/index.js (D:\temp\test2\dist\electron\main.js:3822:1)
      at __webpack_require__ (D:\temp\test2\dist\electron\main.js:21:30)
      at eval (webpack:///./src/main/index.dev.js?:11:1)
      at Object../src/main/index.dev.js (D:\temp\test2\dist\electron\main.js:3810:1)
      at __webpack_require__ (D:\temp\test2\dist\electron\main.js:21:30)
      at eval (webpack:///multi_./src/main/index.dev.js_./src/main/index.js?:1:1)
      at Object.0 (D:\temp\test2\dist\electron\main.js:3880:1)

字符串
我使用bindings是这样的:

const colorBalance = require('bindings')('colorBalance');


我试着将我的模块定义为外部的,但它没有解决问题:

// vue.config.js
module.exports = {
  pluginOptions: {
    electronBuilder: {
      externals: ['NameOfMyModule']
    }
  }
}

i5desfxk

i5desfxk1#

最有可能的情况是,你正在尝试将方法'indexOf'应用于尚未定义的变量。看看文档https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/indexOf。检查你的变量是否在某处定义,并且它应该是数组类型。

bkhjykvo

bkhjykvo2#

在此期间,我尝试导入不带bindings的模块:

const colorBalance = require('../../build/Release/colorBalance.node');

字符串
然后我得到了一个新的错误:

Error: Cannot open D:\temp\test2\build\Release\colorBalance.node: Error: Module did not self-register.
      at Object.eval (webpack:///./build/Release/colorBalance.node?:1:155)
      at eval (webpack:///./build/Release/colorBalance.node?:2:30)
      at Object../build/Release/colorBalance.node (D:\temp\test2\dist\electron\main.js:97:1)
      at __webpack_require__ (D:\temp\test2\dist\electron\main.js:21:30)
      at eval (webpack:///./src/main/index.js?:28:20)
      at Module../src/main/index.js (D:\temp\test2\dist\electron\main.js:3833:1)
      at __webpack_require__ (D:\temp\test2\dist\electron\main.js:21:30)
      at eval (webpack:///./src/main/index.dev.js?:11:1)
      at Object../src/main/index.dev.js (D:\temp\test2\dist\electron\main.js:3821:1)
      at __webpack_require__ (D:\temp\test2\dist\electron\main.js:21:30)


我已经用electron-rebuild重建了电子。我读过关于win_delay_load_hookhere的文章,也试过this,但是错误没有消失。

wvyml7n5

wvyml7n53#

我已经通过将构建链从cmake更改为gyp解决了我的问题。使用gyp编译一切正常。

xwmevbvl

xwmevbvl4#

@grobotor,关于自我注册问题。请参阅这些资源:)

TLDR;我发现我的问题是由于绑定中的这个问题。

"sources": [ ],

字符串
当我试图在Linux上运行自动测试时,这导致了错误“错误:模块没有自我注册”(因为模块只为Mac构建)https://github.com/codebytere/node-mac-permissions/issues/23
关于你最初的问题,我不认为electronBuilder外部是该属性应该在的地方,因为它是一个打包器。externals需要配置打包器,比如webpack的externals
我的配置示例:

// Bundle all deps when building dist (except native modules), otherwise streamline development by just using local node_modules dir
externals: packDistributable ? [{
    permissions: "node-mac-permissions"
}] : [nodeExternals()],

相关问题