Nan Nodejs C ++ определяет структуру вложенных объектов, используя ObjectWrap - PullRequest
0 голосов
/ 03 октября 2018

В настоящее время я работаю над расширением NodeJS в C ++, используя нативные абстракции для nodejs .Все работает и компилируется очень хорошо, я могу определить Nan::SetPrototypeMethod() s и Nan::DefineOwnProperty() s и использовать их в JavaScript.Из-за большого количества функций и свойств, определенных для этого объекта, я хочу реализовать вложенную структуру для этого объекта js, которая позволит пользователю использовать объект следующим образом

const obj = new MyObject();
obj.directFunction(); // working

obj.subclass.childFunction();

Мое расширение C ++ выглядит следующим образом.Точка входа: addon.cc

#include <nan.h>
#include "myAddon.h"

NAN_MODULE_INIT(InitAll) {
  MyAddon::Init(target);
}

NODE_MODULE(addon, InitAll)

myAddon.h

#ifndef MYADDON_H
#define MYADDON_H

#include <nan.h>

#include "subClass.h"


class MyAddon: public Nan::ObjectWrap {
  public:
    static NAN_MODULE_INIT(Init);

  private:
    static NAN_METHOD(New); //constructor
    static NAN_METHOD(directFunction);
    MyAddon();
};

И функция Init в myAddon.cc выглядит как

NAN_MODULE_INIT(MyAddon::Init) {
  auto cname = Nan::New("MyAddon").ToLocalChecked();
  auto ctor = Nan::New<v8::FunctionTemplate>(New);
  auto ctorInst = ctor->InstanceTemplate();

  ctor->SetClassName(cname);
  ctorInst->SetInternalFieldCount(1);

  Nan::SetPrototypeMethod(ctor, "directFunction", directFunction);

  // Working
  Nan::SetPrototypeTemplate(ctor, "subclass", Nan::New<v8::Object>());

  // Trying to bind another class to "subclass" does not work
  Nan::SetPrototypeTemplate(ctor, "subclass", SubClass);

  // Also tested SubClass in a similar way with NAN_MODULE_INIT(Init) and NAN_METHOD(New) functions and use
  SubClass::Init(ctor)
  // which leads to
  // cannot convert from 'v8::FunctionTemplate *' to 'v8::Object *volatile '

  Nan::Set(target, cname, Nan::GetFunction(ctor).ToLocalChecked());
}

subClass.h наследует Nan::ObjectWrap и выглядит как

#ifndef SUBCLASS_H
#define SUBCLASS_H

#include <nan.h>

class SubClass : public Nan::ObjectWrap {
  private:
    // same as: static NAN_METHOD(childFunction)
    static void childFunction(const Nan::FunctionCallbackInfo<v8::Value>& info);

  public:
    SubClass(const Nan::FunctionCallbackInfo<v8::Value>& info);
};

#endif

Также ямы проверили SubClass, который похож на MyAddon, включая методы New и Init, но не работаетЕсть ли у вас какие-либо идеи или предложения?Спасибо и ура!

...