为什么我的 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();