为什么我的NAN_METHOD无法识别?

时间:2018-04-17 20:29:48

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

尝试运行我的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

这是&#39; nodeTest.cpp&#39;文件:

#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);

这是&#39; nodeTest.js&#39;文件:

var tester = require('./nodeTest');
tester.Startup();

这是&#39; package.json&#39;文件:

{
  "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"
}

这是&#39; bindings.gyp&#39;文件:

{
  '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 个答案:

答案 0 :(得分:2)

问题在于文件的命名。您的计划的入口点是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();