问题标签 [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 投票
0 回答
221 浏览

c++ - 打开文件夹时如何强制 Visual Studio 查找头文件

napi.h除非我在将 npm 项目作为文件夹打开时使用相对路径,否则Visual Studio 2019 不会发现。该文件位于node_modules/node-addon-api/napi.h. 如何强制 VS 找到此标头?Additional include directory打开文件夹时有类型选项吗?

头文件在我的笔记本电脑上自动发现,具有相同版本的 VS2019 和相同的环境路径。我nodejs为 Visual Studio 安装了工具。

我希望能够做到#include <napi.h>并发现标头。此刻我必须做#include "../node_modules/node-addon-api/napi.h"

0 投票
1 回答
764 浏览

node.js - 运行 yarn install 时如何避免 node-gyp 重建?

当我运行时yarn install,我的原生插件总是被重建。可以看出,node-gyp rebuild运行的是命令而不是node-gyp build,即使没有更新。

如何让纱线运行node-gyp build而不是node-gyp rebuild?完全重建非常耗时。

0 投票
2 回答
742 浏览

node.js - Node C++ 模块共享库

我正在尝试创建一个 Node C++ 模块来与 Steam api 交互。库文件是./steam/lib/linux64/libsteam_api.so,头文件在./steam。

我创建了一个小的常规 C++ 文件进行测试,它成功使用了 Steam api,使用#include "steam_api.h". 我已经像这样编译并导入了共享库:g++ -L./steam/lib/linux64 -Wl,-rpath=./steam/lib/linux64 -Isteam -lsteam_api main.cpp

绑定.gyp:

当我尝试使用 node-gyp 编译 Node 模块时,我得到 g++: error: ./steam/lib/linux64/libsteam_api.so: No such file or directory

如何正确导入共享库?

0 投票
1 回答
827 浏览

node.js - 本机模块中的异步等待

我正在学习如何使用node-addon-api,现在我被困在 async/await 管理上。我无法理解如何处理本机函数接收具有异步函数的对象的情况。

Javascript:

本国的:

我的问题是我没有找到有关此行为的任何文档。我读到了如何在本机中创建一个 Promise,但没有从 JS 接收到如何使用它。

0 投票
1 回答
528 浏览

c++ - C++ 中的 NAPI 本机模块正在部分执行(包括 std::thread)

我用 NAPI 编写的 Node-js 本机模块正在部分执行。
我在其中使用了多个线程。
在运行模块时,它有时会打印该线程已启动,但有时不会。
无论哪种方式,模块都永远不会到达 c++ 代码的末尾。
我已经尝试将我的 c++ 代码作为一个独立的应用程序,并且工作正常,没有任何警告或错误。
我已经在“CMakeList.txt”C++ 17 支持中打开了异常处理,
因为我使用的 std::filesystem 工作正常。
我在“CMakeList”中使用 find_package(Threads REQUIRED)。

文件 CMakeList.txt=>

文件包.json=>

部分执行的 C++ 代码 =>

函数 ExpSub=>

hwGuess 值为 4

结果应该是上面代码中的打印消息“虽然结束”,并且这应该每次都发生,而不是随机发生(检查随机执行“线程内线”的图像)。[在此处输入图片描述][1]

https://i.stack.imgur.com/55TGy.png

0 投票
1 回答
625 浏览

node.js - 使用 node-addon-api 的 node-gyp Node.js 插件不会覆盖 Linux 上的 c++ 版本

我已经在 Mac OS 上成功地为 node.js 构建了一个 c++ 插件。尝试移植到 Linux (Centos7)。

我正在使用 node.js 版本 12.10、node-gyp 版本 5.0.3、node-addon-api 版本 1.7.1。Centos 版本 7.6.1810,gcc 版本 7.3.1 20180303 (Red Hat 7.3.1-5) (GCC)

我的绑定.gyp:

我尝试在全局空间和条件下添加到 cflags_cc。如果我两者都做,它会将其添加到 g++ 命令行两次。

这是 g++ 上的结果标志

我都试过了-std=c++17-std=c++1z。该common.gypi文件具有以下相关值:

我看过很多帖子说要使用cflags_cc, 我是,但它只是添加它,而不是替换,因此我所依赖的 c++17 特性没有编译。

关于我做错了什么的任何想法?

0 投票
0 回答
1116 浏览

node.js - NodeJs 找不到自定义本机模块(C++ 和 node-addon-api)

我在 C++ 中使用 node-addon-api 构建了自己的 NodeJs 模块,现在我想在 electron.js 应用程序中使用它。但不幸的是卡住了找不到模块错误。

我的项目结构如下:

node-gyp 构建运行没有失败,并且模块位于 /build/Release 文件夹中。

现在我想在我的 index.js 文件中加载模块

当我启动应用程序时,它失败了

错误消息中的路径是正确的,并且 .node 文件在那里。有没有我忘记的其他配置或设置?

这是绑定插件的输出:

然后有一个列表,其中包含它试图找到的一些文件夹。但是我的项目中不存在这些文件夹。

0 投票
2 回答
908 浏览

c++ - 使用 N-API 时如何避免分段错误?

我正在尝试使用节点插件 api (N-NAPI)为 C++ 库Clip构建一个node-js 包装器。我想从用户的剪贴板中检索图像并将其传递给 node.js 缓冲区中的 JavaScript。

这是我尝试过的:(只有相关部分,其余部分在这里

这编译得很好,但是当我尝试在 JavaScript 中使用它时,它会生成一个Segmentation fault (core dumped).

示例 JS 代码:

我该如何解决这个问题?如果我遗漏了一些基本的东西,请原谅,我对 C++ 和构建节点插件非常陌生。

0 投票
1 回答
405 浏览

javascript - 深拷贝 NAPI::Value 对象

我正在(主要是)C++ 中编写一个 Node 插件,它需要将 NAPI::Value 实例从子进程复制到父进程。我需要知道如何做到这一点。查看 NAPI 源代码,我看到 Value 类有两个类型为 napi_env 和 napi_value 的字段。我还看到这些是指针,所以我知道不仅仅是这两个字段必须复制到父线程。

任何关于如何将 NAPI::Value 实例从孩子发送给父母的建议都值得赞赏。

0 投票
1 回答
246 浏览

c++ - 如何构建与操作系统隔离的 node-addon-api?

我有带有 nodejs 的后端服务器并部署在 heroku 上。

问题是我需要使用一些带有 dll 文件的基于 fortran 的程序(64 位和 32 位都存在,并且使用了 64 位)。

为了处理所有这些,我编写了一些 C++ 代码(node-addon-api)。

带有 node-gyp 的 C++ 构建到 .node 文件,它在我的本地环境中工作。

但是,它在 heroku 上失败并出现以下错误。

我找到了一些关于 ELF 标头错误的解释。经过一番搜索,我在下面找到了答案,它似乎完全适合我的情况。

当您在一个架构上构建,然后尝试在不同的架构(或某些情况下的平台)上使用相同的构建插件时,就会发生这种情况。

我的 node-addon-api 开发环境是 Windows 10、64 位。我的假设是 heroku 使用 Linux 操作系统,这就是编译的节点文件不起作用的原因。

总之,我有3个问题。

  1. 在 Docker 上编译 C++ 和 dll(我不知道如何在 Docker 中详细构建)会​​创建可以在 heroku 上执行的节点吗?

  2. 是否有必要对后端和 node-addon-api 进行 dockerize 以确保它们在相同的操作系统中运行?

  3. 似乎使用 docker 部署让 IaaS 更容易,这让我逃离了 PaaS (heroku),但我没有任何经验。这会是逃离heroku的一种方式吗?(我不想更多地使用服务器,因为我现在有足够的工作......)