TypeError:[c ++插件类]不是构造函数

时间:2018-09-29 17:22:03

标签: javascript c++ node.js node-nan

TypeError: m.Default is not a constructor是我尝试使用NAN制作JavaScript类时遇到的错误。

这就是我在做什么:

//AudioDeviceController.h
#pragma once
#include <nan.h>

class Default : public Nan::ObjectWrap 
{
public:
   static Nan::Persistent<v8::FunctionTemplate> constructor;
   static NAN_MODULE_INIT(Init);
   static NAN_METHOD(New);
   static NAN_GETTER(RoleGetter);
   static NAN_SETTER(ReadOnly);
};

AudioDeviceController.cc:

#include "AudioDeviceController.h"
Nan::Persistent<v8::FunctionTemplate> Default::constructor;

NAN_MODULE_INIT(Default::Init)
{
   v8::Local<v8::FunctionTemplate> construct = Nan::New<v8::FunctionTemplate>(Default::New);
   constructor.Reset(construct);
   construct->InstanceTemplate()->SetInternalFieldCount(1);
   construct->SetClassName(Nan::New("Default").ToLocalChecked());

   Nan::SetAccessor(construct->InstanceTemplate(), Nan::New("media").ToLocalChecked(), Default::RoleGetter, Default::ReadOnly);
   Nan::SetAccessor(construct->InstanceTemplate(), Nan::New("communications").ToLocalChecked(), Default::RoleGetter, Default::ReadOnly);

   target->Set(Nan::New("Default").ToLocalChecked(), construct->GetFunction());
}

NAN_METHOD(Default::New)
{
   if(!info.IsConstructCall())
   {
      return Nan::ThrowError(Nan::New("In C++: Default::New - called without new keyword").ToLocalChecked());
   }

   if(info.Length() != 0)
   {
      return Nan::ThrowError(Nan::New("In C++: Default::New - Expected 0 parameters").ToLocalChecked());
   }

   Default *def = new Default();
   def->Wrap(info.Holder());

   info.GetReturnValue().Set(info.Holder());
}

NAN_GETTER(Default::RoleGetter)
{
   //return the correct role
}

NAN_SETTER(Default::ReadOnly)
{
   return Nan::ThrowError(Nan::New("Property is read only").ToLocalChecked());
}

index.cc:

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

NAN_MODULE_INIT(InitModule)
{
   Default::Init(target);
}

NODE_MODULE(winCoreAudio, InitModule);

bindings.gyp:

{
    "targets": [{
        "target_name": "winCoreAudio",
        "include_dirs" : [
            "src",
            "<!(node -e \"require('nan')\")"
        ],
        "sources": [
            "src/index.cc",
            "src/asyncCBclass.cpp",
            "src/AudioDeviceController.cc",
         "src/AudioDevice.cc",
         "src/WinAPIWrap.cpp",
        ]
    }]
}

index.js:

var m = require('./');

var deflt = new m.Default();

这是完整的错误输出:

var deflt = new m.Default();
            ^
TypeError: m.Default is not a constructor
    at Object.<anonymous> (C:\Users\Prime\source\repos\uvAsyncStuff\index.js:25:13)
    at Module._compile (module.js:652:30)
    at Object.Module._extensions..js (module.js:663:10)
    at Module.load (module.js:565:32)
    at tryModuleLoad (module.js:505:12)
    at Function.Module._load (module.js:497:3)
    at Function.Module.runMain (module.js:693:10)
    at startup (bootstrap_node.js:191:16)
    at bootstrap_node.js:612:3

我想要实现的结果是能够使用JavaScript中的new关键字来创建各种对象。我还需要能够使用C ++实例化在C ++代码中声明的新JS对象。我只能猜测Node无法识别我声明的对象。我正在研究的项目中有几个这样的对象,这是最简单的示例。

将与之一起使用的完整项目可以在here中找到。

  • 我正在使用Windows 10进行编译
  • 节点版本:8.11.3
  • NAN版本:2.10.0
  • node-gyp版本:3.7.0。

1 个答案:

答案 0 :(得分:0)

对我来说,我可以通过在$allchannels[ $row[12] ] = $row[13]; 开头直接要求./build/Release/[insert-module-name].node来解决此错误