当前位置: 首页 > 知识库问答 >
问题:

来自本机C++代码的节点js回调会引发错误

郑俊彦
2023-03-14

我正在尝试实现事件侦听器。节点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);

C++代码:

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.cpp: In member function 'Napi::Value PAL:: subscribeEvent(const Napi::CallbackInfo&)':
../PAL.cpp:1915:13: error: use of deleted function 'deviceNapi::deviceNapi()'
  deviceNapi obj;
             ^~~
../PAL.cpp:1903:8: note: 'deviceNapi::deviceNapi()' is implicitly deleted because the default definition would be ill-formed:
 struct deviceNapi {
        ^~~~~~~~~~
../PAL.cpp:1903:8: error: no matching function for call to 'Napi::Env::Env()'

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

共有1个答案

钦永贞
2023-03-14

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

deviceNapi obj;

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

deviceNapi obj = {env, info[1].As<Napi::Function>()};
 类似资料:
  • 我只是在尝试一个简单的回调来获取代码按顺序执行而不是异步执行。这不起作用: 它实际上打印“世界”,然后“你好”到控制台,然后崩溃。但这确实: 我必须总是在调用时编写回调函数代码吗?或者有没有方法引用已经编写的函数?此外,如果我只是希望一个函数在另一个函数完成后发生,这是在Node.js中执行此操作的最佳方法吗?

  • 问题内容: 我正在使用c ++为node.js编写附加组件。 这里有一些片段: 我需要将一个JavaScript函数另存为回调,以便稍后调用。Client类是另一个对象的观察者,应从onAsyncMethodEnds调用javascript回调。不幸的是,当我调用函数“ BeInitiator”时,在回调Call()之前收到“ Bus error:10”错误 感谢建议 问题答案: 您不能从另一个线

  • 我正在做一个编码练习:给定一个整数序列作为一个数组,确定是否可以通过从数组中删除不超过一个元素来获得严格递增的序列。 所以我写了这段代码: 现在,这段代码似乎适用于大多数序列,但这段代码引发了一个错误: 错误如下: 我只是不明白列表索引怎么可能超出范围…有人有线索吗?

  • 我当前的URL看起来像这个 我想删除从这些URL。 mod_rewrite在apache2服务器上启用。在, 我的代码点火器根文件包含, 但它仍然不起作用。我哪里做错了?

  • 我有一个用jade创建的表单,单击submit按钮时它不会回发。我研究了许多类似的问题,尝试了解决方案,包括确保所有输入字段都有一个“名称”,我确保所有输入字段都有一个名称,但表单仍然没有发回,如图所示 //视图/用户/新建。玉 h1新用户 表单(action=“/users”,method=“POST”) p 标签(for="username")用户名 输入#用户名(name=“username

  • 我有一个简单的TCP服务器,它监听一个端口。 我从节点server.js开始,然后在Mac上用Ctrl Z关闭它。当我试图再次运行它与我得到这个错误消息: 我是否以错误的方式关闭程序?我怎样才能防止这种情况发生?