Почему мой NAN_METHOD не распознается?
Я получаю следующую ошибку при попытке запустить собственное расширение 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'
}
1 ответ
Проблема заключается в именовании ваших файлов. Точка входа вашей программы nodeTest.js
который содержит:
var tester = require('./nodeTest');
tester.Startup();
Тогда у вас есть nodeTest.cpp
который будет скомпилирован в nodeTest.node
, Но с помощью require('./nodeTest')
вместо того, чтобы требовать nodeTest.node
что вы пытались сделать, вы требовали nodeTest.js
поскольку .js
является расширением по умолчанию. Если он не может найти .js
файл, он попробует .json
файл. После этого он попытается найти бинарный файл .node
файл.
Так nodeTest.js
требовал себя. Чтобы исправить вашу проблему, либо измените nodeTest.js
в index.js
или используйте правильное расширение при использовании require
,
var tester = require('./nodeTest.node');
tester.Startup();