为什么我的 NAN_METHOD 没有被识别?
Why is my NAN_METHOD not recognized?
我在尝试 运行 我的 Node 本机扩展(构建时没有错误)时收到以下错误。我想知道为什么会出现此错误,因为据我所知,我所做的一切都是正确的。
./NodeTest/nodeTest.js:7
tester.Startup();
^
TypeError: tester.Startup is not a function
at Object.<anonymous> (./NodeTest/nodeTest.js:7:8)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:383:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:496:3
这是 'nodeTest.cpp' 文件:
#include <nan.h>
NAN_METHOD(Startup)
{
auto message = Nan::New("Native Startup() method called.").ToLocalChecked();
info.GetReturnValue().Set(message);
}
NAN_MODULE_INIT(Initialize)
{
NAN_EXPORT(target, Startup);
}
NODE_MODULE(nodeTest, Initialize);
这是 'nodeTest.js' 文件:
var tester = require('./nodeTest');
tester.Startup();
这是 'package.json' 文件:
{
"name": "nodeTest",
"version": "0.0.1",
"scripts": {
"install": "node-gyp rebuild",
"compile": "node-gyp rebuild",
"test": "node nodeTest.js"
},
"dependencies": {
"nan": "^2.8.0"
},
"gypfile": true,
"author": "BT",
"license": "ISC",
"main": "nodeTest.js",
"keywords": [],
"description": "NodeTest"
}
这是 'bindings.gyp' 文件:
{
'targets': [{
'target_name': "nodeTest",
'include_dirs': [
"<!(node -e \"require('nan')\")",
"./src"
],
'cflags': [
"-Wall", "-std=c++11", "-fPIC"
],
'sources': [
"./src/nodeTest.cpp"
]
}, # nodeTest target
{
"target_name": "copy_binary",
"type": "none",
"dependencies" : [ "nodeTest" ],
"copies": [{
'destination': '<(module_root_dir)',
'files': ['<(module_root_dir)/build/Release/nodeTest.node']
}]
} # copy target
] # 'targets'
}
问题出在文件的命名上。您的程序的入口点是 nodeTest.js
,其中包含:
var tester = require('./nodeTest');
tester.Startup();
然后你有 nodeTest.cpp
将被编译成 nodeTest.node
。
但是通过使用 require('./nodeTest')
而不是要求 nodeTest.node
这是你想要做的,你需要 nodeTest.js
因为 .js
是默认扩展 require 会尝试.
如果找不到 .js
文件,它将尝试 .json
文件。之后,它将尝试查找二进制 .node
文件。
所以nodeTest.js
需要自己。为了解决您的问题,请将 nodeTest.js
更改为 index.js
或在使用 require
.
时使用正确的扩展名
var tester = require('./nodeTest.node');
tester.Startup();
我在尝试 运行 我的 Node 本机扩展(构建时没有错误)时收到以下错误。我想知道为什么会出现此错误,因为据我所知,我所做的一切都是正确的。
./NodeTest/nodeTest.js:7
tester.Startup();
^
TypeError: tester.Startup is not a function
at Object.<anonymous> (./NodeTest/nodeTest.js:7:8)
at Module._compile (module.js:570:32)
at Object.Module._extensions..js (module.js:579:10)
at Module.load (module.js:487:32)
at tryModuleLoad (module.js:446:12)
at Function.Module._load (module.js:438:3)
at Module.runMain (module.js:604:10)
at run (bootstrap_node.js:383:7)
at startup (bootstrap_node.js:149:9)
at bootstrap_node.js:496:3
这是 'nodeTest.cpp' 文件:
#include <nan.h>
NAN_METHOD(Startup)
{
auto message = Nan::New("Native Startup() method called.").ToLocalChecked();
info.GetReturnValue().Set(message);
}
NAN_MODULE_INIT(Initialize)
{
NAN_EXPORT(target, Startup);
}
NODE_MODULE(nodeTest, Initialize);
这是 'nodeTest.js' 文件:
var tester = require('./nodeTest');
tester.Startup();
这是 'package.json' 文件:
{
"name": "nodeTest",
"version": "0.0.1",
"scripts": {
"install": "node-gyp rebuild",
"compile": "node-gyp rebuild",
"test": "node nodeTest.js"
},
"dependencies": {
"nan": "^2.8.0"
},
"gypfile": true,
"author": "BT",
"license": "ISC",
"main": "nodeTest.js",
"keywords": [],
"description": "NodeTest"
}
这是 'bindings.gyp' 文件:
{
'targets': [{
'target_name': "nodeTest",
'include_dirs': [
"<!(node -e \"require('nan')\")",
"./src"
],
'cflags': [
"-Wall", "-std=c++11", "-fPIC"
],
'sources': [
"./src/nodeTest.cpp"
]
}, # nodeTest target
{
"target_name": "copy_binary",
"type": "none",
"dependencies" : [ "nodeTest" ],
"copies": [{
'destination': '<(module_root_dir)',
'files': ['<(module_root_dir)/build/Release/nodeTest.node']
}]
} # copy target
] # 'targets'
}
问题出在文件的命名上。您的程序的入口点是 nodeTest.js
,其中包含:
var tester = require('./nodeTest');
tester.Startup();
然后你有 nodeTest.cpp
将被编译成 nodeTest.node
。
但是通过使用 require('./nodeTest')
而不是要求 nodeTest.node
这是你想要做的,你需要 nodeTest.js
因为 .js
是默认扩展 require 会尝试.
如果找不到 .js
文件,它将尝试 .json
文件。之后,它将尝试查找二进制 .node
文件。
所以nodeTest.js
需要自己。为了解决您的问题,请将 nodeTest.js
更改为 index.js
或在使用 require
.
var tester = require('./nodeTest.node');
tester.Startup();