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

How are function failures propagated for NodeJS Wrapped C++ Code?

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

function send([Object], callback fn)

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

在后台,node-quickfix 利用 NodeJS nan 绑定到 C++ 代码。底层的 quickfix 包是 C++。我很好奇的是这个发送函数中的错误,比如来自网络断开的错误,是如何传播到 JS 代码的。在 node-quickfix 的 FIXSession class 中,它覆盖了 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}`);
});

睡眠的定义:

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 块中调用 SetErrorMessage() 函数。这将导致调用 nodejs 端的错误回调,并将错误消息传递给 SetErrorMessage.

我用这个 post 作为来源:https://medium.com/@muehler.v/tutorial-to-native-node-js-df4118efb678