自从我使用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: … 该v8::FunctionCallbackInfo级区分This和Holder。我知道thisJavaScript中的内容,并假设这This反映了该设置。但是我对什么Holder是一个模糊的概念,对于何时应该使用Holder而不是却一无所知This。
特别是,在编写基于nan的node.js扩展并解包时ObjectWrap,我应该通过哪些?
当前node::ObjectWrap文档中有使用示例,Holder而当前Nan::ObjectWrap文档中使用This,因此“仅遵循文档中的示例”无助于回答这个问题。
我在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*?
我正在创建一个Node插件,以便将一些函数暴露libmpg123给Javascript.具体来说,我需要以某种方式将指向out123_handle对象的指针传回javascript,这是从out123_new生成的.这些示例没有提到将指针传回任何地方.我是C++以及Node插件的全新手,所以请保持温和.非常感谢您的帮助!
我尝试在Visual Studio代码中为使用GYP编译的C++ Node-Addon设置调试.如果可能的话,我想逐步完成源代码.我使用typescript作为我的服务器语言,并包含由gyp编译的".node"文件.这工作正常,但我如何设置它,所以我不仅可以通过打字稿代码,还可以通过C++代码?
.cc文件的VSCode断点:

我知道我可以node-gyp rebuild --debug使用gyp 编译调试版本,但我没有计划如何在vscode中使用它.
的文档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()。
我想使用V8 Float32Array数据结构.我该如何初始化它?
我也对直接存储器访问数据感兴趣.怎么可能这样呢?
我有一个 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 库。
我正在尝试创建一个基本的本机节点插件,其中从节点传递一个 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++ 的正确方法是什么?甚至有可能吗?
我一直在浏览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直接使用
node.js-addon ×10
node.js ×9
c++ ×8
v8 ×3
n-api ×2
asynchronous ×1
c ×1
javascript ×1
libuv ×1
node-gyp ×1
node.js-nan ×1