Как создать иерархию пространства имен в аддоне node.js?

Я создаю надстройку node.js, в которой есть куча классов. Я хочу организовать их в иерархическом пространстве имен. Если бы я делал это в Javascript, это выглядело бы так

var com = function() {};

com.example = function() {};

com.example.Person = function () {};

var p = new com.example.Person();

Я использую Nan для написания привязки node.js. Для достижения вышеуказанного результата я написал код следующим образом:

ком.ч

namespace addon {
  void init(Local<Object> exports);
}

com.cpp

void addon::init(Local<Object> exports)
{
  addon::Example::Init(exports);
}

NODE_MODULE(com, com::init)

пример.h

namespace addon {
  class Example : public Nan::ObjectWrap {
    static void Init(v8::Local<v8::Object> exports);
  }
}

пример.cpp

void addon::Example::Init(v8::Local<v8::Object> exports) {

  // Prepare constructor template
  v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
  tpl->SetClassName(Nan::New("example").ToLocalChecked());
  tpl->InstanceTemplate()->SetInternalFieldCount(1);

  addon::Person::Init(tpl);

  constructor.Reset(tpl->GetFunction());
}

человек.ч

namespace addon {
  class Person : public Nan::ObjectWrap {
    static void Init(v8::Local<v8::FunctionTemplate> exports);
  }
}

человек.cpp

void addon::Person::Init(v8::Local<v8::FunctionTemplate> nmspace) {
  Nan::HandleScope scope;

  // Prepare constructor template
  v8::Local<v8::FunctionTemplate> tpl = Nan::New<v8::FunctionTemplate>(New);
  tpl->SetClassName(Nan::New("Person").ToLocalChecked());
  tpl->InstanceTemplate()->SetInternalFieldCount(1);

  // Prototype
  // ...

  constructor.Reset(tpl->GetFunction());
  nmspace->Set(Nan::New("Person").ToLocalChecked(), tpl->GetFunction()); // XXXXXX

}

Этот код компилируется, а также успешно проходит тесты при запуске. Однако я получаю предупреждение, когда аддон загружается.

(node) v8::FunctionTemplate::Set() with non-primitive values is deprecated
(node) and will stop working in the next major release.

Он печатает трассировку стека. Верхняя часть этой трассы находится на линии, отмеченной XXXXXX.

Если это не рекомендуемый способ определения FunctionTemplate как члена другого FunctionTemplate, то как правильно это сделать? Любые идеи?


person Jayesh    schedule 13.06.2016    source источник


Ответы (1)


Я нашел простой способ сделать это. Мне пришло в голову, что я могу добиться того же самого с помощью следующего кода Javascript.

var com = {};
com.example = {};
com.example.Person = function () {};
var p = new com.example.Person();

Итак, я обнаружил, что совершенно необязательно определять класс ObjectWrap для примера. Вместо этого я определил его как простой объект

v8::Isolate *isolate = v8::Isolate::GetCurrent();
v8::Handle<Object> example = v8::Object::New(isolate);

а затем передал его Person::Init() вот так

void addon::Person::Init(v8::Local<v8::Object> nmspace) {
  // ...
  nmspace->Set(Nan::New("Person").ToLocalChecked(), tpl->GetFunction());
}

Полученный код работает без каких-либо предупреждений или ошибок.

person Jayesh    schedule 13.06.2016