Дождитесь устройства и подайте ответ на веб-страницу - PullRequest
1 голос
/ 27 июня 2019

Я пытаюсь использовать модуль nfc из npm для чтения смарт-карты и отправки результатов в веб-интерфейс.

Все идет хорошо, если подключено устройство чтения карт. Но если устройство чтения карт неподключен, веб-сервер (nodejs) зависает и не обслуживает страницы.

Вот мой код в utils.js:

exports.rfidPolling = function(socket){
        var nfc = new NFC()
        nfc.on('reader', reader => {                
                reader.autoProcessing = false;
                reader.aid = 'F222222222';
                notifyFn(socket,`${reader.reader.name}  device attached`)
                ...
        })
        nfc.on('error', err => {
                console.log('an error occurred', err);
                errorFn(socket,`An error occured : ${err}`)
        });

}

И в моем файле server.js Я звоню rfidPolling работает следующим образом:

... 
var io = require('socket.io').listen(server);
io.on('connection', function(socket){
    utils.rfidPolling(socket)
})
...

Я думаю, что nfc.on('reader',... является причиной его замерзания.

Но я не могу придумать, как этого избежать ...

Спасибо

Приветствия

1 Ответ

0 голосов
/ 28 июня 2019

анализ источника


class NFC: public Nan::ObjectWrap {
  public:
    static NAN_METHOD(New);
    static NAN_METHOD(Start);
    static NAN_METHOD(Stop);

с nfc.Start обработка:

nfc_device *pnd;
...
pnd = nfc_open(context, ...)

nfc_open

и в случае отсутствия устройства pnd будет null и, следовательно, срабатывает:

if (pnd == NULL) {
   nfc_exit(context);
   return Nan::ThrowError("unable open NFC device");
}

который приводит в вашем примере к:

errorFn(socket,\`An error occured : ${err}\`)

Идея попробовать:

exports.rfidPolling = function(socket){
        var nfc = new NFC()
        nfc.on('reader', reader => {                
                reader.autoProcessing = false;
                reader.aid = 'F222222222';
                notifyFn(socket,`${reader.reader.name}  device attached`)
                ...
        })
        nfc.on('error', err => {
                console.log('an error occurred', err);
                errorFn(socket,`An error occured : ${err}`)
        });
        setTimeout(function(){
            nfc.Stop()
            notifyFn(socket,`${null} device timeout`)
        }, 4000)
        nfc.Start() // undefined | Error 
}
...