代码之家  ›  专栏  ›  技术社区  ›  Felix Lemke

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

  •  3
  • Felix Lemke  · 技术社区  · 7 年前

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

    #第0行出现致命错误

    #检查失败:!价值目标->IsJSReceiver()| |值对象->IsTemplateInfo()。

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

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

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Nicholas Pipitone    7 年前

    所有模板(包括InstanceTemplate)中只能包含其他模板或原语。如你所见, IsTemplateInfo 是假的,本来应该是真的。提出并回答了一个类似的问题 here . 简单地做一个 ObjectTemplate 然后像你用 FunctionTemplate .

    仅当模板实例化时(使用 GetFunction

        2
  •  0
  •   Felix Lemke    7 年前

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

    只需更换 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 }
    

    原型

    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] }
    
    推荐文章