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