NodeJS Nan C++ 将嵌套对象绑定到插件实例

NodeJS Nan C++ bind nested object to addon instance

在我目前正在处理的 C++ NodeJS 项目中,我想要一个包含嵌套对象的对象,例如

console.log(object.myObject); // { [keys: string]: any }

在没有将对象绑定到属性的情况下,我的插件运行良好。我用

创建实例
auto ctor = Nan::New<v8::FunctionTemplate>(New);
auto ctorInst = ctor->InstanceTemplate();

并将对象绑定到 class 实例,如

v8::Local<v8::Object> obj = Nan::New<v8::Object>();
ctorInst->Set(Nan::New("myObject").ToLocalChecked(), obj);

执行 JS 代码(创建 C++ 扩展实例)时打印以下内容。

# Fatal error in , line 0

# Check failed: !value_obj->IsJSReceiver() || value_obj->IsTemplateInfo().

另一方面,绑定基元(数字、字符串等)工作完美。

ctorInst->Set(Nan::New("myObject").ToLocalChecked(), Nan::New<v8::Number>(42));

你有什么建议吗?谢谢,干杯!

所有模板(包括 InstanceTemplate 的模板)中只能包含其他模板或基元。如您所见,IsTemplateInfo 是错误的,而它应该是正确的。有人提出并回答了类似的问题 here. Simply make an ObjectTemplate,然后像使用 FunctionTemplate.

一样填充它

只有当模板被实例化时(GetFunction),你才能用真实的对象填充它。

除了尼古拉斯的回答,我还想补充以下内容。

实例

只需将 v8::Object 替换为 v8::ObjectTemplate。为对象模板设置属性并将模板绑定到插件实例。

v8::Local<v8::ObjectTemplate> objTemplate = Nan::New<v8::ObjectTemplate>();
objTemplate->Set(Nan::New("prop").ToLocalChecked(), Nan::New<v8::Number>(42));
ctorInst->Set(Nan::New("myObject").ToLocalChecked(), objTemplate);

现在您可以使用

console.log(addonInstance.myObject); // { prop: 42 }

原型

如果要将函数绑定到对象,请像上面那样创建一个对象模板。然后从现有的 cpp 函数创建一个函数模板,并将其绑定到对象模板的对象 属性。然后在插件实例原型上创建一个模板。

v8::Local<v8::ObjectTemplate> objTemplate = Nan::New<v8::ObjectTemplate>();
objTemplate->Set(Nan::New("prop").ToLocalChecked(), Nan::New<v8::Number>(42));

auto fn = Nan::New<v8::FunctionTemplate>(setup);
objTemplate->Set(Nan::New("setup").ToLocalChecked(), fn);
Nan::SetPrototypeTemplate(ctor, "myObj", objTemplate);

设置函数很简单

NAN_METHOD(YourClass::setup) {
  info.GetReturnValue().Set(Nan::New<v8::String>("Hello world").ToLocalChecked());
}

控制台输出将是

console.log(addonInstance.myObject) // { prop: 42, setup: [Function: setup] }