node.js — Nan Nodejs C ++ определяет структуру вложенных объектов с помощью ObjectWrap

В настоящее время я работаю над расширением NodeJS C ++, используя нативные абстракции для nodejs. Все работает и компилируется очень хорошо, я могу определить Nan::SetPrototypeMethod()с и Nan::DefineOwnProperty()и использовать их в 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();
};

И В этом функция в 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, но ни один из них не работает. Есть ли у вас какие-либо идеи или предложения? Спасибо и ура!

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]