问题标签 [node-native-addon]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
342 浏览

c++ - 为什么我会收到主题行的分段错误

我正在为 RocksDB 创建一个本机节点扩展,我已经确定了一个我无法解释的问题。所以我有以下完美运行的代码:

但是当我引入一种减少额外的优化时,memcpy我得到了段错误:

这是Get方法签名:

任何想法为什么会发生这个问题?

先感谢您!

编辑

可以肯定的是,我还检查了以下版本(它也失败了):

编辑

根据评论中的请求,提供更完整的示例:

启动上述方法的代码在 TypeScript 中实现并在 NodeJS 中运行,这里是完整的清单:

基本上这段代码代表了 KeyValueDatabase->Get("Some key") 方法的实现,你将一个字符串传递给它,你会得到一个字符串作为回报。但很明显,问题是围绕new std::string()电话跳舞,我想我可能会得到一些解释,为什么这样不好?如何在没有副本的情况下将字符串值从一个字符串移动到另一个字符串?

0 投票
1 回答
624 浏览

c - 如何使用 node.js N-API 函数检查 napi_number 类型的 napi_value 是整数还是小数,

如何使用 node.js 原生 N-API 函数检查给定的napi_number类型的napi_value整数还是小数(带有小数值的数字)。看起来 N-API 中没有 isInt() 或 isDouble() 等效函数(我们也不想使用 V8 函数调用)。让我们考虑一个场景,我们通过传递一个 JavaScript 对象作为参数从 JavaScript调用本机插件函数f1() ,如代码段所示。

本机函数f1()希望通过调用最佳拟合值提取 N-API 函数来提取与键n1n2关联的值。例如,要提取n1的值,最好使用napi_get_value_int*之一,同样对于n2double是更好的选择。

不幸的是,我找不到任何 N-API 函数来验证napi_number 属性的导数。你有没有遇到过类似的情况,如果有,你是怎么解决这个问题的?

https://nodejs.org/api/n-api.html

0 投票
1 回答
130 浏览

c++ - 如何更新 Node.js 原生插件以使用新 API?

我的工作需要一个旧的 Node.js 本机插件,但由于弃用了许多本机 API,因此不再适用于 Node.js 12 及更高版本。在几十个错误中,除了一个与初始化和调用回调函数有关的错误外,我已经修复了所有错误。新的 API 需要 4 个参数,而旧的 API 需要 3 个。这是损坏的代码:

具体来说,请注意使用 4 个参数的新 API,并将其与只需要三个参数的旧 API 进行对比。我不知道要输入什么参数,因为互联网上基本上没有新 API 的教程,而且互联网上充斥着旧 API 的示例。

谁能指出我正确的方向?我收到的确切错误消息error C2660: 'v8::Function::Call': function does not take 3 arguments在我用上面的注释标记的行中。

0 投票
2 回答
468 浏览

c++ - 未加载节点 gyp 库:/usr/local/lib/libmtp.9.dylib

我一直在尝试制作一个使用 libmtp 执行某些功能的 nodejs-native-addon。我已经成功构建了应用程序,但是Library not loaded: /usr/local/lib/libmtp.9.dylib. Referenced from: /path/build/Debug/nbind.node. Reason: image not found当我尝试在另一个未安装 libmtp 的 macbook 上运行它时,应用程序抛出错误。

这是我的binding.gyp文件:

我什至尝试在库选项中包含 dylib 文件

但该应用程序无法以Library not loaded: /usr/local/lib/libmtp.9.dylib. Referenced from: /path/build/Debug/nbind.node. Reason: image not found错误启动。

任何帮助将不胜感激。

0 投票
1 回答
1342 浏览

c++ - 如何在 MacOS 上的 NodeJS 本机插件上创建 OpenGL 上下文?

跟进这个问题。

我正在尝试创建一个使用 OpenGL 的 NodeJS 本机插件。

我无法使用 OpenGL 函数,因为CGLGetCurrentContext()总是返回NULL.

尝试创建要绘制的新上下文时,CGLChoosePixelFormat始终返回错误kCGLBadConnection invalid CoreGraphics connection

让我烦恼的是,当我将创建 OpenGL 上下文的代码隔离到一个独立的 CPP 项目中时,它就可以工作了!当我在 NodeJS 插件中运行它时,它只会给出一个错误!

我创建了这个 NodeJS 原生插件项目来举例说明我的错误:https ://github.com/Psidium/node-opengl-context-error-example

这是在独立项目上执行时有效的代码,在 NodeJS 中运行时会出错:

我已经尝试过:

  • 用于在子进程fork()中创建上下文(不起作用);
  • 将属性更改为pixelformat可以创建我的上下文的内容(不起作用);

我有一种预感,它可能与 Node 本机插件是一个动态链接库这一事实有关,或者我的 OpenGLcreateContext函数可能没有在主线程上执行(但如果是这种情况,fork()那就已经解决了对的?)。

0 投票
1 回答
43 浏览

node.js - 为什么 N-API 在使用 napi_property_descriptor 数组时找不到某些绑定?

我有以下代码...

当我运行 hello world 部分工作正常但前进和停止功能失败...

TypeError:bindings.forward 不是函数

我对 C 开发很陌生,不明白如何找到错误。为什么 hello world 函数工作正常但 forward 函数失败?

0 投票
0 回答
75 浏览

node.js - Node.js 原生模块构建缓存

我们的项目非常大,编译原生插件依赖npm ci或清理npm install需要几分钟。

node_modules除了整体保存之外,有没有办法缓存和重用内置的原生插件?

0 投票
1 回答
486 浏览

javascript - 如何告诉本地节点模块所需的 dll 存储在哪里?

我目前正在开发一个用于 Node.Js 和 Electron 的本机节点模块,它需要额外的 dll 才能工作(以及 Linux 和 Mac 上的任何等价物)。我并不是真正的 C++ 开发,也没有在互联网上找到这个问题的解决方案,所以我可能需要你的一些支持:)

因此,当所有内容都存储在同一个(工作)目录中时,它工作得很好,但这不是你可以长期使用的东西。特别是当我将所有内容打包到一个可以用 NPM 加载的模块中时,带有它的 dll 的模块存储在一个子文件夹中,如“./node_modules/native-module/build/Release/adddon.node[或 dll]”。

我可以轻松地使用 require 包含该模块,但它不再找到任何 dll,因为如果我正确理解 C++ 行为,它只会在 PATH 和当前工作目录(执行 Electron 或 Node.js 的位置)中查找dll。

我的第一个解决方法是将 cwd 更改为所有 dll 所在的“Release”文件夹。但是当你喜欢使用 webpack 的热重载功能时,更改 cwd 会变得非常混乱,我将其用于开发目的。您总是必须检查 cwd 是否已经更改,它不再正确显示页面,我真的认为这不是这样做的方法。

所以我的问题是动态告诉节点模块dll存储在哪里的正确方法是什么?提前致谢。

PS:如果这很重要,我将使用 cmake-js 进行构建过程。

0 投票
1 回答
130 浏览

node.js - 将节点终端/main.js 日志打印到渲染器控制台(开发人员工具)

我有一个电子应用程序,其中使用了 c++ 本机插件。

C++ 代码将日志打印到终端,在开发时我可以在 termianl 中看到它们。
Electron 应用登录 renderer.js 控制台(开发者工具控制台)。
构建应用程序可执行文件后不会发生同样的事情,因为那里没有 termianl ......

所以在构建之后我只能看到 renderer.js 日志并且不能从 main.js 和 c++ 代码访问日志。

ISSUE:
如何将终端日志和 main.js 日志打印到渲染器控制台。

0 投票
0 回答
103 浏览

c++ - NAPI:如何匹配来自 C++ 线程的 JS 正则表达式?

我正在修改一个 Node 本机扩展,它产生本机线程来进行一些处理。我的问题是我想让 Javascript 代码为处理提供一个过滤器以排除一些数据。

在这一点上,我将一个 JS RegExp 字符串从 JS 传递到 C++,std::regex从中创建一个实例,并将它传递给不同的结构,向下传递到本机线程逻辑。

我现在的问题是,尽管std::regex使用的语法似乎与 ECMAScript 正则表达式相同,但行为并不相同 :(

我最初的计划是以某种方式依赖 V8 的 RegExp 引擎,但直接触发 C++ 位,而不是从 C++ 到 JS 再返回。但我无法找到如何做到这一点。

例如,请参阅以下程序使用相同的正则表达式但产生不同的结果:

等效的JS代码:

那么我的问题是:我能做些什么来获得与 JS 但在 C++ 中相同的结果?是否可以从纯 C++ 上下文运行 V8 的 RegExp?