Испускание события в Node.js Аддон C (N-API)

#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. И я полагаю, что вам также нужна область обратного вызова рядом с прицелом.