问题标签 [node-addon-api]

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 投票
2 回答
217 浏览

c++ - 使用 node-addon-api 链接共享库

我正在使用node-gypand为 C 共享库构建 Node.js 包装器node-addon-api。有用!但是由于该库是从 Golang 代码构建的,因此我对不同的架构有不同的构建——该模块无法从 Go 源代码本身编译 C 库。

我的问题是,一旦我将库文件移动到 Node 模块内的子目录中,该模块就不再工作了。我希望该库位于子目录中,以便我可以使用条件提供为不同架构构建的副本。

像这样在根目录中的所有文件:

binding.gyp这样的:

...然后node-gyp rebuild运行良好,并node index.js从库返回预期的输出。

当我将库移动到子目录时,如下所示:

binding.gyp像这样更新:

我收到此错误:

我已经尝试了librariesand的所有组合,include_dirs但无法找到库。

0 投票
0 回答
57 浏览

javascript - 在 Node.js C++ 插件 (N-API) 中发出事件

我有一个使用扫描仪 SDK 的 c++ 插件。扫描条形码时,我想将该数据传递给我的 Node.js 应用程序。在 c++ 代码尝试发出 'barcodeScanned' 事件之前,一切正常(包括 'connect' 事件)。

我收到的错误是:

相关代码:

测试.js

0 投票
0 回答
20 浏览

node.js - 使用 node-addon-api 时替换 util.inherits

util.inherits现在不鼓励使用;ES6 和 extends 关键字是首选。但是,当扩展的类来自 node-addon-api 时,有没有办法做到这一点?

这是来自 node-addon-examples 存储库的示例:

我怎样才能重写它以避免使用util.inherits

0 投票
2 回答
129 浏览

c++ - C++ N-API 多类型签名

我正在学习 C++ 并玩弄OpenCVand node-addon-api。我想为cv::Vec. 文档

当然上面的例子是行不通的,因为cv::Vec希望我告诉typeand size。所以像这样:cv::Vec<int, 3>可以工作并创建一个 3 维向量。

我的问题是如何正确重载构造函数并定义_wrappedClass_类型?

我应该创建扩展当前类的类Vec2、类Vec3等等Vec吗?

当我查看更有经验的开发人员如何处理该问题时,我在opencv4nodejs中找到了这个示例。这似乎更合理:

  • 1个cpp文件
  • 基础头文件
  • 类变体的附加头文件

在 GitHub 上有完整的示例。

0 投票
1 回答
41 浏览

node.js - 节点插件在电子中不起作用,但在 nodejs 中起作用

我写了一个 nodejs 插件,用 node-gyp 编译。它不适用于电子,但 nodejs 工作。nodejs 和 electron 节点版本相同。

插件做这些事情:

  1. 加载 ffmpeg 静态库并打开一个 rtsp 或本地文件。
  2. 将帧转换为 rgba 颜色到 arraybuffer 并调用电子的主进程。
  3. 渲染器进程处理数据事件并将数据渲染到画布元素。

在电子中,以下代码总是返回Protol not found

节点gyp配置:

0 投票
1 回答
100 浏览

c++ - 哪个是编写用于平面文件管理的 graphql api 的最佳方法?

在这里,我将讨论 GraphQL 在我的 Project 数据结构中的实现。

在我的项目中,我使用平面文件(文本文件)固定宽度格式进行数据库管理。我想将 API 开发与它集成。从 CPP 程序查询的平面文件。在这种情况下,我很难为 CPP Node Addon Native modules (OR) Nodejs NPM module GraphQL 选择 GraphQL API。

案例 1:有没有办法为NPM GraphQL 包使用平面文件配置?

案例 2:有没有办法使用 node-addon-api 编写 Node Native 模块?(对于 CPP 开发人员使用来自 github 中名为cppgraphqlgen的开源项目的 GraphQL 解析器)

如果我选择第二种情况,我将面临以下问题。

我正在尝试将 cppgraphqlgen 服务编写为节点插件本机模块。我提到了更多关于那个的话题。在我的项目中,一些模块已经使用Napi.h在 CPP Node 插件 Native 模块中编写。在这个用不同 API 编写的 cppgraphqlgen 项目中,比如nan.hcppgraphiql使用 Nan。我很难将这些服务编写为我的项目的节点插件。

在我的项目中制作文件如下:

在 cppgraphqlgen 中有两个名为 schemegen 和 clientgen 的服务。上述两项服务均已成功构建。此实用程序使用 CMake(需要 GNU 10.3.0)。但在我的项目中有实用程序 GNU Make。我的 make 实用程序构建命令不会使用 node-addon-api (Napi.h) 编译 cppgraphqlgen 项目的示例程序。我想要一个用于 cppgraphqlgen 项目的简单入门程序。

例如:

使用 schemagen 服务,自动生成的文件是 HelloSchema.cpp 和 HelloSchema.h

使用 clientgen 服务,自动生成的文件是 HelloClient.cpp 和 HelloClient.h

我将 HelloClient.cpp 更改为节点插件本机

HelloClient.cpp

输入架构

输入查询:

输出如:

另一个尝试在名为 today 的项目文件夹中的示例程序(使用 TodayMock 的 sample.cpp。我尝试编写 HelloMock)

HelloMock.h

HelloMock.cpp

你好.cpp

NodeJS程序:

如果有办法在 GraphQL API 服务中使用平面文件。请告诉我。我想为我的项目急切地使用 GraphQL API 编写一个较新的实现。以及如何在第二个clientgen服务中使用和实现node addon?客户端有什么用?请帮我。

0 投票
2 回答
29 浏览

node.js - NodeJS 模块编译

我有一个使用node-addon-api接口的节点添加模块。

这将生成一个我可以从 NodeJS 加载的模块require('./mod.node')

从 makefile 进行此编译的步骤是什么?

0 投票
1 回答
36 浏览

c++ - 将 stdlib 和 rand 与 Node 本机模块 (node-gyp) 一起使用

这只是问题的一个例子。

假设我有utils.cc

以及使用它的这个文件

然后将这些函数导出为<node.h>.

问题出在rand()功能上。代码编译(我在代码中包含了stdlib),这是binding.gyp

但是在运行时我收到了这个错误:

如果我不使用它就会消失rand()

0 投票
1 回答
92 浏览

chromium - 可以使用 _HAS_ITERATOR_DEBUGGING=1 为调试模式构建 nw 插件吗?(视窗)

原始问题:有什么方法可以让 nw-gyp 默认添加到构建项目中的宏?

我正在开发一个 nw 插件,并尝试将自定义静态库链接到 .node DLL。但是我发现 nw-gyp 默认会添加 _HAS_ITERATOR_DEBUGGING=0 (它总是附加到插件项目以覆盖自定义定义),这将影响 STL 类型的实际结构大小(例如 std::string)。

那么有没有一种方法可以默认添加这样的宏节点 gyp,或者是否有一种简单的方法可以使静态库和 nw 构建项目的编译器(可能是整个工具链、链接工具等)配置相同?

现在我已将 _HAS_ITERATOR_DEBUGGING=0 添加到我的库中并使其成为 MT(D),它似乎工作正常,但我不确定这是否是正确的方法。(其他一些编译器设置可能不会导致编译错误,但可能会在运行时崩溃)

编辑:分享一些分析,让我的起源问题更清楚。

当前所有问题都在 Windows 平台上。

即使我在调试模式下构建 nw 插件(使用 --debug),也会添加 _HAS_ITERATOR_DEBUGGING=0,这可能会受到 nw-gyp 下载的 nw 头文件的影响。例如,从http://node-webkit.s3.amazonaws.com/v0.49.2/nw-headers-v0.49.2.tar.gz下载的标头,您将'defines': [ 'DEBUG', '_DEBUG', 'V8_ENABLE_CHECKS', '_HAS_ITERATOR_DEBUGGING=0' ]在 Debug_Base 配置部分的第 288 行的 common.gypi 中找到,这很可能是从https://github.com/nwjs/chromium.src继承的(我猜这里是https://github.com/nwjs/chromium.src/blob/nw60/build/config/BUILD.gn #L130)。那么是否可以断定 Chrome 是故意为调试模式添加这些定义的呢?

_HAS_ITERATOR_DEBUGGING=0调试对我来说有什么问题? 嗯,它会影响许多 STL 类(std::string、std::vector 等)的大小。所以所有需要链接到nw插件的调试库都应该用 编译'_HAS_ITERATOR_DEBUGGING=0',否则静态库会发生编译错误和动态库的运行时指针问题崩溃(结构偏移不匹配)(当然使用STL不是一个好习惯在动态库头文件中,但如果您可以假设工具链相同,它仍然可以正常工作)。但是当涉及到第三方二进制文件时,这对我来说真的很难,我没有大部分的源代码,所以我不能给一个调试静态库_HAS_ITERATOR_DEBUGGING=0。当我需要使用 lldb 或 VS 调试插件时,这真的很令人沮丧,因为所有变量都经过优化,您无法调试它们的值。

我可以强制_HAS_ITERATOR_DEBUGGING=1进入调试模式吗?如原始问题中所述,它不能像@mmomtchev的回答那样正常完成。一种破解方法是在 gyp 文件中添加插件,这将附加"/D _HAS_ITERATOR_DEBUGGING=1"到编译命令的末尾,从而覆盖以前的定义。但我不确定这是否是一个好的解决方法!我检查了 v8 头文件并发现了一些带有 std::string 和 std::vector 成员的类。如果你使用这些类,我认为 force _HAS_ITERATOR_DEBUGGING 会引起一些问题,但对于其他类来说它是安全的(我已经测试了很多情况,像 v8::value v8::function 这样的普通类运行良好)。并且与其他插件合作时不安全。configurations->Debug->msvs_settings->VCLinkerTool->AdditionalOptions/D _HAS_ITERATOR_DEBUGGING=1假设一个调试插件 A 和另一个发布插件 B 需要相互通信,他们同意使用一个 C++ 结构进行数据交换。一种常见的方法是让 A 将 C++ 结构实例包装到 JS 对象中供用户使用。并让用户通过调用B提供的方法将JS对象传递给B(JS对象是参数之一),然后B将JS对象从参数中解包并获取C++结构实例的指针。一切看起来都很好,但是如果 C++ 结构有 std::string 成员怎么办?A 和 B 的相同 C++ 结构的大小不同。所以 B 在尝试访问类型为 std::string 或 std::vector 的成员时会崩溃。如果 _HAS_ITERATOR_DEBUGGING=0 设置为调试模式,这不是问题,因为 _HAS_ITERATOR_DEBUGGING 总是禁用发布,我猜那

所以我的最后一个问题是:如果这不是强制_HAS_ITERATOR_DEBUGGING=1调试的好方法,而且我没有许多外部编译的 lib 二进制文件的源代码,这是否意味着我无法在调试模式下构建 nw 插件?另一种可能的方法是用 C 风格的 API 包装这些库并将它们编译为动态库,但这对我来说确实是一项巨大的工作并且是不可接受的。

0 投票
1 回答
49 浏览

c++ - 从 NodeJS 插件构建本机对象

期待

我想使用像下面的 javascript 模块一样工作的本机 NodeJS 模块来实现

方法

我的尝试是,(在其他一些失败的尝试中)

问题

当我尝试使用来自 javascript 的已编译模块时节点被终止

环境

如果您想要与我使用的环境相同的环境,这里有一个 dockerfile。