问题标签 [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.
c++ - 使用 node-addon-api 链接共享库
我正在使用node-gyp
and为 C 共享库构建 Node.js 包装器node-addon-api
。有用!但是由于该库是从 Golang 代码构建的,因此我对不同的架构有不同的构建——该模块无法从 Go 源代码本身编译 C 库。
我的问题是,一旦我将库文件移动到 Node 模块内的子目录中,该模块就不再工作了。我希望该库位于子目录中,以便我可以使用条件提供为不同架构构建的副本。
像这样在根目录中的所有文件:
和binding.gyp
这样的:
...然后node-gyp rebuild
运行良好,并node index.js
从库返回预期的输出。
当我将库移动到子目录时,如下所示:
并binding.gyp
像这样更新:
我收到此错误:
我已经尝试了libraries
and的所有组合,include_dirs
但无法找到库。
javascript - 在 Node.js C++ 插件 (N-API) 中发出事件
我有一个使用扫描仪 SDK 的 c++ 插件。扫描条形码时,我想将该数据传递给我的 Node.js 应用程序。在 c++ 代码尝试发出 'barcodeScanned' 事件之前,一切正常(包括 'connect' 事件)。
我收到的错误是:
相关代码:
测试.js
node.js - 使用 node-addon-api 时替换 util.inherits
util.inherits
现在不鼓励使用;ES6 和 extends 关键字是首选。但是,当扩展的类来自 node-addon-api 时,有没有办法做到这一点?
这是来自 node-addon-examples 存储库的示例:
我怎样才能重写它以避免使用util.inherits
?
c++ - C++ N-API 多类型签名
我正在学习 C++ 并玩弄OpenCV
and node-addon-api
。我想为cv::Vec
. 文档
当然上面的例子是行不通的,因为cv::Vec
希望我告诉type
and size
。所以像这样:cv::Vec<int, 3>
可以工作并创建一个 3 维向量。
我的问题是如何正确重载构造函数并定义_wrappedClass_
类型?
我应该创建扩展当前类的类Vec2
、类Vec3
等等Vec
吗?
当我查看更有经验的开发人员如何处理该问题时,我在opencv4nodejs中找到了这个示例。这似乎更合理:
- 1个cpp文件
- 基础头文件
- 类变体的附加头文件
我在 GitHub 上有完整的示例。
node.js - 节点插件在电子中不起作用,但在 nodejs 中起作用
我写了一个 nodejs 插件,用 node-gyp 编译。它不适用于电子,但 nodejs 工作。nodejs 和 electron 节点版本相同。
插件做这些事情:
- 加载 ffmpeg 静态库并打开一个 rtsp 或本地文件。
- 将帧转换为 rgba 颜色到 arraybuffer 并调用电子的主进程。
- 渲染器进程处理数据事件并将数据渲染到画布元素。
在电子中,以下代码总是返回Protol not found
节点gyp配置:
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.h。cppgraphiql使用 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?客户端有什么用?请帮我。
c++ - 将 stdlib 和 rand 与 Node 本机模块 (node-gyp) 一起使用
这只是问题的一个例子。
假设我有utils.cc
以及使用它的这个文件
然后将这些函数导出为<node.h>
.
问题出在rand()
功能上。代码编译(我在代码中包含了stdlib),这是binding.gyp
:
但是在运行时我收到了这个错误:
如果我不使用它就会消失rand()
;
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 包装这些库并将它们编译为动态库,但这对我来说确实是一项巨大的工作并且是不可接受的。
c++ - 从 NodeJS 插件构建本机对象
期待
我想使用像下面的 javascript 模块一样工作的本机 NodeJS 模块来实现
方法
我的尝试是,(在其他一些失败的尝试中)
问题
当我尝试使用来自 javascript 的已编译模块时节点被终止
环境
如果您想要与我使用的环境相同的环境,这里有一个 dockerfile。