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

时间:2018-10-20 13:56:52

标签: c++ node.js v8

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

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

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

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

并将对象绑定到类实例上

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

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

  

第0行出现#个致命错误

     

#检查失败:!value_obj-> IsJSReceiver()|| value_obj-> IsTemplateInfo()。

另一方面,绑定原语(数字,字符串等)可以完美地工作。

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

您有什么建议吗?谢谢,加油!

2 个答案:

答案 0 :(得分:1)

所有模板(包括InstanceTemplate的模板)中只能有其他模板或基元。如您所见,IsTemplateInfo是错误的,应该是正确的。 here提出并回答了类似的问题。只需制作一个ObjectTemplate,然后像使用FunctionTemplate一样填充它即可。

仅当实例化模板(使用GetFunction)时,才能使用实际对象填充模板。

答案 1 :(得分:0)

除了尼古拉斯的回答,我还要添加以下内容。

实例

只需将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] }