gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 21:31:43 25 4
gpt4 key购买 nike

我特别感兴趣的是这个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com