标签: node.js-addon

从v8函数中获取默认参数的最短路径(单线程)?

自从我使用C++以来已经有很长一段时间了,甚至更长时间以来我一直围绕着硬类型.我只是在寻找一个工作的衬管来从v8获取参数,或者在没有提供参数时使用默认值.

v8::String::Utf8Value arg0(args[0]);
v8::String::Utf8Value arg1(args[1]);
v8::String::Utf8Value arg2(args[2]);
const char *username = (args.Length() > 0) ? *arg0 : "";
const char *password = (args.Length() > 1) ? *arg1 : "";
const char *service = (args.Length() > 2) ? *arg2 : "login";
Run Code Online (Sandbox Code Playgroud)

输出:

func(); // { username: "", password: "", service: "login" }
func('1'); // { username: "1", password: "", service: "login" }
func('1', '2'); // { username: "1", password: "2", service: "login" }
func('a', 'b', 'c'); // { username: …

c++ v8 node.js node.js-addon

5
推荐指数
1
解决办法
5699
查看次数

这与ObjectWrap :: Unwrap的持有人

v8::FunctionCallbackInfo级区分ThisHolder。我知道thisJavaScript中的内容,并假设这This反映了该设置。但是我对什么Holder是一个模糊的概念,对于何时应该使用Holder而不是却一无所知This

特别是,在编写基于nan的node.js扩展并解包时ObjectWrap,我应该通过哪些?

当前node::ObjectWrap文档中有使用示例,Holder当前Nan::ObjectWrap文档中使用This,因此“仅遵循文档中的示例”无助于回答这个问题。

c++ v8 node.js node.js-nan node.js-addon

5
推荐指数
1
解决办法
410
查看次数

如何将v8 :: String转换为const char*

我在dll中有这个功能

static COMMANDERDLL_API int InsertCodeBar(const char* pszBuffer);
Run Code Online (Sandbox Code Playgroud)

在我的节点插件我有这个功能

void InsertCodeBarWrapper(const FunctionCallbackInfo<Value>& args){
    Isolate* isolate = args.GetIsolate();

    Local<Function> cb = Local<Function>::Cast(args[1]);
    Local<String> bar = args[0]->ToString();
    const unsigned argc = 1;
    Local<Value> argv[argc] = { CSGPCommander::InsertCodeBar(bar) };
    cb->Call(isolate->GetCurrentContext()->Global(), argc, argv);
}
Run Code Online (Sandbox Code Playgroud)

当我尝试编译时,node-gyp返回错误:"无法将参数1从'v8 :: Local'转换为'const char*'

如何将v8 :: String转换为const char*?

c++ v8 node.js node-gyp node.js-addon

5
推荐指数
1
解决办法
8068
查看次数

如何在创建节点加载项时传回c ++对象指针

我正在创建一个Node插件,以便将一些函数暴露libmpg123给Javascript.具体来说,我需要以某种方式将指向out123_handle对象的指针传回javascript,这是从out123_new生成的.这些示例没有提到将指针传回任何地方.我是C++以及Node插件的全新手,所以请保持温和.非常感谢您的帮助!

javascript c++ node.js node.js-addon

5
推荐指数
0
解决办法
168
查看次数

VS Code调试C++ Node Addon

我尝试在Visual Studio代码中为使用GYP编译的C++ Node-Addon设置调试.如果可能的话,我想逐步完成源代码.我使用typescript作为我的服务器语言,并包含由gyp编译的".node"文件.这工作正常,但我如何设置它,所以我不仅可以通过打字稿代码,还可以通过C++代码?

.cc文件的VSCode断点:

我知道我可以node-gyp rebuild --debug使用gyp 编译调试版本,但我没有计划如何在vscode中使用它.

c++ node.js visual-studio-code node.js-addon

5
推荐指数
1
解决办法
1519
查看次数

如何异步使用node-addon-api的AsyncContext

的文档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()

node.js node.js-addon n-api node-addon-api

5
推荐指数
1
解决办法
247
查看次数

Node C++ Addon - 当它作为参数传递时,如何访问Typed Array(Float32Array)?

我想使用V8 Float32Array数据结构.我该如何初始化它?

我也对直接存储器访问数据感兴趣.怎么可能这样呢?

c++ node.js node.js-addon

4
推荐指数
1
解决办法
1636
查看次数

libuv线程通信

我有一个 C++ 库,客户端应用程序使用这个库从服务器查询数据。这个库创建了一个单独的线程与服务器通信,查询结果将作为回调函数中的参数传递。

现在我想将这个 c++ lib 包装到 nodejs 原生模块,因为回调函数是在这个 lib 自己的线程中调用的,为了将查询结果传递给 js 环境,我相信我必须使用 libuv 的 uv_async_send(uv_async_t* async) 方法来传递两个线程之间的数据。(如果我错了,请纠正我)

根据libuv 的文档

警告:libuv 将合并对 uv_async_send() 的调用,也就是说,并非每次调用都会产生回调的执行。例如:如果在调用回调之前连续调用 uv_async_send() 5 次,则回调只会被调用一次。如果在调用回调后再次调用 uv_async_send() ,则会再次调用。

这个警告是否意味着 uv_async_send 可能导致数据丢失?我想知道 libuv 是否为这个问题提供了更好的解决方案,或者我应该使用其他一些 thead 库。

c++ multithreading node.js libuv node.js-addon

4
推荐指数
1
解决办法
2049
查看次数

Node-Addon-Api 传递数组作为函数参数

我正在尝试创建一个基本的本机节点插件,其中从节点传递一个 javascript 数组,然后在 C++ 中进行处理。问题是我无法弄清楚如何正确传递数组。我可以毫无问题地实例化数组,但使用 info[0].as 分配它会引发错误。

我的 C++ 代码是

#include <napi.h>

using namespace Napi;
using namespace std;

Value Add(const CallbackInfo& info) 
{
  Env env = info.Env();


  Array result = Napi::Array::New(env);
  Array a = info[0].As<Array>;

  double arg1 = info[1].As<Number>().DoubleValue();
  Number num = Napi::Number::New(env, 2 + arg1);

  return num;
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误是

../cppsrc/main.cpp: In function ‘Napi::Value Add(const Napi::CallbackInfo&)’:
../cppsrc/main.cpp:12:21: error: conversion from ‘<unresolved overloaded function type>’ to non-scalar type ‘Napi::Array’ requested
   Array a = info[0].As<Array>;
             ~~~~~~~~^~~~~~~~~
Run Code Online (Sandbox Code Playgroud)

将数组传递给 C++ 的正确方法是什么?甚至有可能吗?

c++ node.js node.js-addon

4
推荐指数
1
解决办法
4268
查看次数

如何将 napi_threadsafe_function 用于 NodeJS Native Addon

我一直在浏览NAPI 文档,试图了解它是如何处理multithreading. 根据文档napi_create_threadsafe_function()napi_call_threadsafe_function()用于js functions从多个线程创建和调用。问题是文档不是那么直截了当,并且没有示例,我在其他任何地方都找不到。

如果有人有任何使用经验napi_create_threadsafe_function()和/napi_call_threadsafe_function()或知道在哪里可以找到使用它们的示例。请如果你能帮助一个基本的例子,这样我就可以理解如何正确使用它们。

我正在C编写一个插件,而不是C++需要使用这些功能。我没有使用包装器node-addon-api,而是napi直接使用

c asynchronous node.js-addon n-api

4
推荐指数
1
解决办法
2117
查看次数