c++ - NodeJS Wrapped C++ 代码的函数故障是如何传播的?

标签 c++ node.js quickfix

我特别感兴趣的是这个 nodeJS 包装器如何用于 quickfix node-quickfix处理发送 FIX 消息的失败。有问题的函数签名似乎是:

function send([Object], callback fn)

这可以在给定的示例中看到 here .

在幕后,node-quickfix 利用了 NodeJS nan绑定(bind)到 C++ 代码。底层的 quickfix 包是 C++。我很好奇的是这个发送函数中的错误,比如来自网络断开的错误,是如何传播到 JS 代码的。在 node-quickfix 的 FIXSession 类中,它覆盖了 nan 的 HandleOKCallback(但不是它的 HandleErrorCallback):

void HandleOKCallback () {
    Nan::HandleScope scope;

    v8::Local<v8::Function> fn = callback->GetFunction();
    if(!(fn->IsUndefined() || fn->IsNull())) {
        Local<Value> argv[] = { Nan::Null() };
        callback->Call(1, argv);
    }
};

nan默认的HandleOKCallback和HandleErrorCallback的定义是here .似乎 FIXInitiator 确实有一个错误回调,但我不知道它是如何在 javascript/NodeJS 中传播或访问的。

EDIT1:我添加了一个 github issue我怀疑是问题所在,但我不知道它是否正确,或者解决方案是什么。我在 github 问题中的分析有一些额外的信息。

EDIT2:向 node-quickfix 添加了建议更改:FixSendWorker.cpp Execute():

void FixSendWorker::Execute () {
  try {
    FIX::Session::sendToTarget(*message);
  } catch(FIX::SessionNotFound& e) {
    this->SetErrorMessage("Failed to send FIX Message");
    std::cout << "*** Session not found!" << std::endl;
  }
}

我在启动器中使用的代码片段:

console.log('sleeping for 5 seconds');
sleep(5000)
console.log('done sleeping');
this.send(req, (err) => {
    console.log(`ERROR: ${err}`);
});

sleep 的定义:

function sleep(miliseconds) {
   var currentTime = new Date().getTime();
   while (currentTime + miliseconds >= new Date().getTime()) {
   }
}

最佳答案

我检查了 node-quickfix 中的 nan Execute 函数,它正在捕获一个特定的异常并且不传播它:

void FixSendWorker::Execute () {
    try {
        FIX::Session::sendToTarget(*message);
    } catch(FIX::SessionNotFound& e) {
        std::cout << "*** Session not found!" << std::endl;
    }
}

为了使 nan 调用 HandleErrorCallback,您应该在 Execute 函数的 catch block 中调用 SetErrorMessage() 函数。这将导致调用 nodejs 端的错误回调,并将错误消息传递给 SetErrorMessage

我将这篇文章用作来源:https://medium.com/@muehler.v/tutorial-to-native-node-js-df4118efb678

关于c++ - NodeJS Wrapped C++ 代码的函数故障是如何传播的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57438481/

相关文章:

java - SocketInitiator getSession 提供的 session 顺序与配置文件中的顺序不同

python - quickfix 发送时间(字段 52)下降毫秒

finance - FIX session 级拒绝

C++ 从类型 ‘void*’ 到类型 ‘double’ 的无效转换

javascript - 判断 collection.forEach 是否完成

javascript - 在node.js中做一系列的异步操作

node.js - node expressjs - 使用 body-parser 中间件解析 multipart/form-data POST 数据

c++ - 如何实现 Floyd 算法在具有矩形障碍物的 11x11 网格上寻找最短路径?

c++ - 内存池和 <Unable to read memory>

c++ - 为什么结构内部的对象初始化不同?