C++ 来自本机C+的节点js回调+;代码正在抛出错误

C++ 来自本机C+的节点js回调+;代码正在抛出错误,c++,node.js,node-addon-api,n-api,C++,Node.js,Node Addon Api,N Api,我正在尝试实现事件侦听器。节点JS将订阅事件(使用C++函数)。当事件发生时,C++应该通知节点JS. JS代码: pal.subscribeEvent("ONSTATECHANGE", function(a) { console.log("Event received for ONSTATECHAN";}); function kcb (a) { console.log("KCB .....ONSTATECHAN"+JSO

我正在尝试实现事件侦听器。节点JS将订阅事件(使用C++函数)。当事件发生时,C++应该通知节点JS.

JS代码:

pal.subscribeEvent("ONSTATECHANGE", function(a) { console.log("Event received for ONSTATECHAN";});
function kcb (a)  {
    console.log("KCB .....ONSTATECHAN"+JSON.stringify(a));
}
pal.subscribeEvent("ONSTATECHANGE", kcb);
struct deviceNapi {
    Napi::Env env;   // to store JS Function Env
    Napi::Function jsCallback;   // to Store JS function
};

//std::multimap<int, Napi::Function> deviceEventMgmt;
std::multimap<int, struct deviceNapi> deviceEventMgmt;

Napi::Value PAL::subscribeEvent(const Napi::CallbackInfo& info) {
    Napi::Env env  = info.Env();
    int eventID = info[0].As<Napi::Number>().Int32Value();

    deviceNapi obj;
    obj.env = env;
    obj.jsCallback = info[1].As<Napi::Function>();

    deviceEventMgmt.insert(std::make_pair(eventID, obj));
    /*Napi::Function jsCallback = info[1].As<Napi::Function>();
    deviceEventMgmt.insert(std::make_pair(eventID, jsCallback));*/
}

void ProcessDeviceEvent(int evt, DeviceEvtData data) {
    switch(evt) {
        case ONSTATECHANGE:
            for(auto it = deviceEventMgmt.begin(); it != deviceEventMgmt.end(); it ++) {
                if(it->first == ENUM_VERIZON_DEVICE_PENDING_RESET) {
                    Napi::Env env = it.second.env;
                    Napi::Object ret = Napi::Object::New(env);

                    ret.Set("reason", Napi::String::New(env, data.resetReason));
                    ret.Set("time", Napi::Number::New(env, data.seconds));

                    it->second.jsCallback.Call(ret);
                }
            }

            /*for(auto it = deviceEventMgmt.begin(); it != deviceEventMgmt.end(); it ++) {
                if(it->first == ENUM_VERIZON_DEVICE_PENDING_RESET) {
                    it->second.Call();
                }
            }*/

            break;

        default:
            std::cout << "ProcessDeviceEvent : Currently not handling evt : " << evt << std::endl;
            break;
    }
}
C++代码:

pal.subscribeEvent("ONSTATECHANGE", function(a) { console.log("Event received for ONSTATECHAN";});
function kcb (a)  {
    console.log("KCB .....ONSTATECHAN"+JSON.stringify(a));
}
pal.subscribeEvent("ONSTATECHANGE", kcb);
struct deviceNapi {
    Napi::Env env;   // to store JS Function Env
    Napi::Function jsCallback;   // to Store JS function
};

//std::multimap<int, Napi::Function> deviceEventMgmt;
std::multimap<int, struct deviceNapi> deviceEventMgmt;

Napi::Value PAL::subscribeEvent(const Napi::CallbackInfo& info) {
    Napi::Env env  = info.Env();
    int eventID = info[0].As<Napi::Number>().Int32Value();

    deviceNapi obj;
    obj.env = env;
    obj.jsCallback = info[1].As<Napi::Function>();

    deviceEventMgmt.insert(std::make_pair(eventID, obj));
    /*Napi::Function jsCallback = info[1].As<Napi::Function>();
    deviceEventMgmt.insert(std::make_pair(eventID, jsCallback));*/
}

void ProcessDeviceEvent(int evt, DeviceEvtData data) {
    switch(evt) {
        case ONSTATECHANGE:
            for(auto it = deviceEventMgmt.begin(); it != deviceEventMgmt.end(); it ++) {
                if(it->first == ENUM_VERIZON_DEVICE_PENDING_RESET) {
                    Napi::Env env = it.second.env;
                    Napi::Object ret = Napi::Object::New(env);

                    ret.Set("reason", Napi::String::New(env, data.resetReason));
                    ret.Set("time", Napi::Number::New(env, data.seconds));

                    it->second.jsCallback.Call(ret);
                }
            }

            /*for(auto it = deviceEventMgmt.begin(); it != deviceEventMgmt.end(); it ++) {
                if(it->first == ENUM_VERIZON_DEVICE_PENDING_RESET) {
                    it->second.Call();
                }
            }*/

            break;

        default:
            std::cout << "ProcessDeviceEvent : Currently not handling evt : " << evt << std::endl;
            break;
    }
}

可以帮助我解决如何将节点函数Env存储到C++映射中的问题。我需要保存env,以便在调用节点回调时发送响应。

Napi::env没有默认构造函数,因此DeviceAPI结构的默认构造函数无法初始化env成员,因此编译器没有生成它,但您尝试在此行中调用它:

deviceNapi obj;
您可以通过如下方式初始化它来修复此问题:

deviceNapi obj = {env, info[1].As<Napi::Function>()};
deviceNapi obj={env,info[1].As()};