2016-06-13 3 views
0

私はクラスの束を持っているnode.jsアドオンを作成しています。階層的な名前空間でそれらを整理したいと思います。私はJavaScriptでこれをやっていたならば、それは私が私のバインディングのNode.jsを書くためにナンを使用しています。このnode.js addonに名前空間階層を作成する方法は?

var com = function() {}; 

com.example = function() {}; 

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

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

ようになります。

com.h

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

com.cpp

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

NODE_MODULE(com, com::init) 

example.h

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

example.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()); 
} 

person.h

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

person.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のメンバーとして定義することが推奨される方法でない場合は、それを達成する正しい方法は何ですか?何か案は?

答えて

0

これを行う簡単な方法が見つかりました。次の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); 

として定義し、次に、得られたコードは、警告やエラーなしで動作し、この

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

ようPerson::Init()にそれを渡します。

関連する問題