NodeJS Addon从NAN内部调用JavascriptcallbackAsyncWorker :: Execute

我想从我的asynchronous附加函数中调用nodejscallback。 我已经看到了同步的例子( 在这里 ),我正在使用一个奇妙的asynchronous例子( 在这里 )作为一个起点。

但是,当我尝试执行给c ++ AsyncWorker子类的callback时,出现分段错误。

这是我的代码:

#include <nan.h> #include <functional> #include <iostream> #include <exception> using namespace Nan; using namespace v8; using namespace std; class ScriptWorker : public AsyncWorker { public: ScriptWorker(Callback *callback, const std::map<std::string, Callback*>) : AsyncWorker(callback), script(script), cbs(cbs) {} ~ScriptWorker() {} void Execute () { // ------------------------ // Segmentation fault after // ------------------------ Local<Value> argv[] = { New<v8::Number>(id) }; // ------------------------- // Segmentation fault before // ------------------------- cbs["getUser"]->Call(1, argv); } private: std::string script; std::map<std::string, Callback*> cbs; }; NAN_METHOD(Method) { Local<Object> array = info[0]->ToObject(); Callback *callback = new Callback(info[1].As<Function>()); // Build up callbacks passed in from javascript. // Will be a dynamic loop, but for now, hard code the one getUser example. std::map<std::string, Callback*> cbs; cbs.insert(std::pair<std::string, Callback*>("getUser", new Callback( array->Get( v8::String::NewFromUtf8(v8::Isolate::GetCurrent(), "getUser") ).As<Function>() ) )); AsyncQueueWorker(new ScriptWorker(callback, cbs)); } NAN_MODULE_INIT(Init) { Nan::Set(target, Nan::New<String>("hello").ToLocalChecked(), Nan::GetFunction(Nan::New<FunctionTemplate>(Method)).ToLocalChecked()); } NODE_MODULE(hello, Init) 

我的问题:

  1. 我不应该使用楠的AsyncWorker,而是我自己?
  2. 如何设置执行function调用JavaScript?

编辑:

看到这个回购:

https://github.com/xavero/node_addon_sample

它有一个关于如何使用callback函数和从C地发射事件的例子。

您不应该在ScriptWorker的Execute方法中调用v8 / Nan函数,否则将会出现段错误。 重写HandleOKCallback函数以使用JavaScriptcallback。

从JavaScript中调用,在你的C ++插件:

 NAN_MODULE_INIT(Init) { Nan::Set(target, Nan::New("myJsFunctionName").ToLocalChecked(), Nan::GetFunction(Nan::New<FunctionTemplate>(Method)).ToLocalChecked()); } NODE_MODULE(anyNameHere, Init) 

并在您的JavaScript:

 // run "npm install bindings --save" in console first var addon = require('bindings')('NativeExtension'); addon.myJsFunctionName({ foo: "bar"}, (arg1,arg2) => console.log(`${arg1} - ${arg2}`))