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
我对 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