#javascript #c #node.js #node-addon-api
Вопрос:
У меня есть надстройка на c , которая использует SDK сканера. Когда сканируется штрих-код, я хочу передать эти данные своему Node.js приложение. Все работает (включая событие «подключение») до тех пор, пока код c не попытается выдать событие «Штрих-код».
Ошибка, которую я получаю, заключается в:
# # Fatal error in v8::HandleScope::CreateHandle() # Cannot create a handle without a HandleScope #
Релевантный код:
void NodeZebraAddon::SetEmitFunction(const Napi::CallbackInfo amp;info) { Napi::Env env = info.Env(); Napi::Function func = info[0].Aslt;Napi::Functiongt;(); EventEmitter = Napi::Persistent(info[0].Aslt;Napi::Functiongt;()); EventEmitter.Call({Napi::String::New(EventEmitter.Env(), "connect")}); } void NodeZebraAddon::OnBarcodeEvent(short int eventType, std::string amp;pscanData) { Napi::HandleScope scope(EventEmitter.Env()); cout lt;lt; "Barcode Detected" lt;lt; endl; cout lt;lt; "Out XML" lt;lt; endl; cout lt;lt; pscanData lt;lt; endl; EventEmitter.Call({Napi::String::New(EventEmitter.Env(), "barcodeEvent"), Napi::String::New(EventEmitter.Env(), pscanData)}); }
test.js
const emitter = new EventEmitter() const instance = new NodeZebraAddon(); emitter.on('connect', () =gt; { console.log('onConnect'); }) emitter.on('barcodeEvent', (evt) =gt; { console.log(evt); }) instance.setEmitFunction(emitter.emit.bind(emitter));
Комментарии:
1. Мое первое предположение заключается в том, что «OnBarcodeEvent» вызывается в другом потоке. Вы можете вызывать код js только в главном потоке nodejs. И я полагаю, что вам также нужна область обратного вызова рядом с прицелом.