javascript - TypeError: [c++ 插件类] 不是构造函数
问题描述
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);
};
音频设备控制器.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());
}
索引.cc:
#include <nan.h>
#include "AudioDeviceController.h"
NAN_MODULE_INIT(InitModule)
{
Default::Init(target);
}
NODE_MODULE(winCoreAudio, InitModule);
绑定.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
我试图实现的结果是能够new
在 JavaScript 中使用关键字来创建各种对象。我还需要能够使用 C++ 实例化我在 C++ 代码中声明的新 JS 对象。我只能猜测 Node 没有识别我声明的对象。我正在从事的项目中有几个这样的对象,这个是最简单的例子。
可以在此处找到将要使用的完整项目。
- 我正在使用 Windows 10 进行编译
- 节点版本:8.11.3
- 南版:2.10.0
- 节点gyp版本:3.7.0。
解决方案
./build/Release/[insert-module-name].node
对我来说,我可以通过在开头直接要求来修复这个错误index.js
推荐阅读
- python - Python 安装包:无法使用 pip install 命令安装包
- django - 如何通过 DRF 从 Django QuerySet 中将每一列作为一个列表
- r - 使用条件处理列表中的数据帧以子集行,使用 R 处理另一个数据帧
- java - 鉴于 Spring Boot 应用程序启用了 OAUTH,如何使 swagger-ui 可见?
- python - ValueError:无法将大小为 60000 的数组重塑为形状 (60000,784)
- jenkins - 一个詹金斯大师上同一插件的多个版本
- django - 密码字段属性未正确呈现注册页面 Django
- laravel - 如何处理 Laravel 中的查询异常?
- spring-cloud - 以编程方式动态地将实例添加到 SimpleDiscoveryClient - Spring Cloud
- java - 在单独的线程中初始化 Ktor 可以吗?