我正在尝试为 Node.js 创建一个本地插件,当我包含
#include <napi.h>
Run Code Online (Sandbox Code Playgroud)
VS Code 的 Intelli Sense 表示它无法检测到node_api.h位置(它包含在 中napi.h)。
node-gyp build运行良好并且可以编译。但我不明白系统中的标题在哪里以及node-gyp从哪里获取?我需要添加 Intelli Sense 选项的路径并更好地理解一般的构建过程。
我正在玩这个代码示例。
我正在为 NodeJS 构建一个 C++ 插件,我想将数据从 C++ 异步传输到 Node。但是,我找到了这篇文章https://nodeaddons.com/streaming-data-into-a-node-js-c-addon/;我想使用 N-API 而不是 NAN。
我一直在搜索 NodeJS 文档和示例,并寻找其他资源和示例,但还没有找到一个资源来向我展示如何实现这一点。这是我第一次为 NodeJS 编写 C++ 插件。
一个可以帮助我入门的示例是一个插件,它使用 N-API 每秒向 Node 发送一个虚拟字符串,然后 Node 会将字符串打印到控制台。
当我运行时yarn install,我的本机插件总是被重建。可以看出,即使没有更新任何内容,也node-gyp rebuild运行命令而不是node-gyp build。
caros@ubuntu:~/Developer/xviz-converter$ yarn install
yarn install v1.16.0
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
$ node-gyp rebuild
gyp info it worked if it ends with ok
gyp info using node-gyp@3.8.0
gyp info using node@10.16.0 | linux | x64
gyp info spawn /usr/bin/python2
....
Run Code Online (Sandbox Code Playgroud)
如何让纱线运行node-gyp build而不是node-gyp rebuild?完全重建非常耗时。
的文档AsyncContext具有可同步工作的此示例(仅作了少许修改,但仍可正常工作):
#include "napi.h"
void MakeCallbackWithAsyncContext(const Napi::CallbackInfo& info)
{
Napi::Function callback = info[0].As<Napi::Function>();
Napi::Object resource = info.Env().Global().As<Napi::Object>();;
Napi::AsyncContext context(info.Env(), "async_context_test", resource);
callback.MakeCallback(Napi::Object::New(info.Env()),
std::initializer_list<napi_value>{}, context);
}
Run Code Online (Sandbox Code Playgroud)
我想知道如何异步使用它-这是我的最新照片:
Napi::AsyncContext* _context;
Napi::FunctionReference* _callback;
Napi::Object* _resource;
void CallBack()
{
_callback->MakeCallback(*_resource, std::initializer_list<napi_value>{}, *_context);
}
void MakeCallbackWithAsyncContext(const Napi::CallbackInfo& info)
{
Napi::Function cb = info[0].As<Napi::Function>();
_callback = new Napi::FunctionReference(Napi::Persistent(cb));
_callback->SuppressDestruct();
_resource = new Napi::ObjectReference(Napi::Persistent(env.Global()));
_resource->SuppressDestruct();
_context = new Napi::AsyncContext(info.Env(), "async_context_test", _resource->Value());
// run CallBack() in different thread
}
Run Code Online (Sandbox Code Playgroud)
程序内部崩溃CallBack()。
我正在尝试调试在电子应用程序中调用的节点附加组件,但我找不到启动 c 调试器或将 c 调试器附加到应用程序的方法。当一个简单的节点应用程序调用它时,通过在启动调试器时调用节点,将 js 文件作为参数传递,我成功地调试了它(我使用了本教程: https: //medium.com/@atulanand94/debugging- nodejs-c-addons-using-vs-code-27e9940fc3ad)。有没有办法启动电子可执行文件,以类似的方式传递应用程序的主代码(index.js)?
好吧,首先我对C ++还是很陌生,所以如果我的理解很差,我深表歉意。我会尽力解释自己。我所拥有的是我正在使用一个返回a的库函数,std::shared_ptr<SomeObject>然后我有一个采用原始指针参数的库函数(更具体地说是node-addon-api Napi::External<T>::New(Napi::Env env, T *data)静态函数)。我想Napi::External使用我的std :: shared_ptr 创建一个对象。我目前正在做的是这样的:
{
// ...
std::shared_ptr<SomeObject> pSomeObject = something.CreateSomeObject();
auto ext = Napi::External<SomeObject>::New(info.Env(), pSomeObject.get());
auto instance = MyNapiObjectWrapper::Create({ ext });
return instance;
}
Run Code Online (Sandbox Code Playgroud)
但是我担心这会遇到内存问题。我的pSomeObject仅存在于当前作用域中,因此我想应该在返回之后发生,它的引用计数将降为0,并且它指向的SomeObject实例将被销毁,因此我返回的实例将出现问题使用此对象。但是我已经能够从我的实例运行此代码并在SomeObject上调用函数,所以我在想我的理解可能是错误的。
我的问题是当给定共享指针时该怎么办,但由于其他第三方库要求,我需要处理原始指针?向我提出的一个选择是对对象进行深层复制并创建一个指向该对象的指针。
如果我对这方面的理解是错误的,请纠正我,因为我说过我对C ++很陌生。
===========================
编辑:
因此,我从原始帖子信息中丢失了有关所有权以及该区块的确切含义。该块是用于实例的实现的实例方法Napi::ObjectWrap。此实例方法需要返回Napi::Object,供node.js中的调用者使用。我正在使用,Napi::External因为在创建I return 时需要将子类型传递Napi::Value给构造New函数Napi:Object,并且我需要在包装SomeObject中提取包装对象的外部对象,MyNapiObjectWrapper如下所示:
class MyNapiObjectWrapper
{
private:
SomeObject* someObject;
static Napi::FunctionReference constructor; // ignore for now
public:
static void Init(Napi::Env env) {...}
MyNapiObjectWrapper(const …Run Code Online (Sandbox Code Playgroud) c++ memory-management smart-pointers shared-ptr node-addon-api
C++ 本机模块的 std::cout 控制台消息不会在模块构建后打印在控制台上。
有什么方法可以在控制台上打印运行时 std::cout 消息,然后我们可以使用 node.js 在电子应用程序中捕获这些消息
node.js 如何运行本机模块,它是在与沙盒程序相同的线程上运行还是在不同的线程上运行?
node.js ×6
c++ ×3
electron ×2
n-api ×2
node-gyp ×2
debugging ×1
javascript ×1
rebuild ×1
shared-ptr ×1
yarnpkg ×1