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] }
在我目前正在处理的 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] }