Почему мой 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();
Другие вопросы по тегам