使用Nan

时间:2017-12-16 18:39:51

标签: javascript node.js node.js-addon node.js-nan

在尝试打开它并开始使用它之前,我试图验证传递给节点插件的对象是否是正确的类型。这是我通过查看网络上各种来源拼凑而成的解决方案。

持久数据:

Nan::Persistent<v8::Function> Event::constructor;
Nan::Persistent<v8::FunctionTemplate> Event::tpl;

Init函数:

void Event::Init(v8::Local<v8::Object> exports) {
    Nan::HandleScope scope;

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

    // create a template for checking instances
    Local<FunctionTemplate> localTemplate = Nan::New<FunctionTemplate>(Event::New);
    localTemplate->SetClassName(Nan::New("Event").ToLocalChecked());
    tpl.Reset(localTemplate);

    // Statics
    Nan::SetMethod(ctor, "x", Event::X);

    // Prototype
    Nan::SetPrototypeMethod(ctor, "addInfo", Event::addInfo);
    Nan::SetPrototypeMethod(ctor, "toString", Event::toString);

    constructor.Reset(ctor->GetFunction());
    Nan::Set(exports, Nan::New("Event").ToLocalChecked(), ctor->GetFunction());
}

我尝试使用它的地方:

    if (Nan::New(tpl)->HasInstance(info[0])) {
        message = "it is an Event instance";
    }

问题是HasInstance()永远不会返回true。

JavaScript代码基本上是

let e = new Event()
fn(e)     // where fn performs the HasInstance() test.

2 个答案:

答案 0 :(得分:1)

尝试使用Nan::New(Event::constructor)->HasInstance(info[0])代替FunctionTemplate。否则看起来是正确的。您可能需要info[0]->ToObject() - 如果需要,我会忘记。

答案 1 :(得分:1)

无需再输入FunctionTemplate。您在导出上设置的一个(ctor)是在JS中调用new Event()时使用的一个,而第二个(localTemplate)被保存到{{1 }},并从中进行Event::tpl调用。它们是不同的HasInstance(),因此FunctionTemplate调用返回HasInstance()

代替此:

false

只需尝试:

...
Local<FunctionTemplate> localTemplate = Nan::New<FunctionTemplate>(Event::New);
localTemplate->SetClassName(Nan::New("Event").ToLocalChecked());
tpl.Reset(localTemplate);
...