Как прослушать событие socket.io на маршруте, чтобы перенаправить на другой маршрут в экспрессе? - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь повторить аутентификацию через веб-приложение WhatsApp QRCode для моего проекта "Последний год", который представляет собой интерактивную систему управления медицинскими услугами. В этой короткой истории системы врач должен иметь возможность просматривать рецепты пациентов, только если пациент позволяет ему, и это разрешение должно быть дано, когда он сканирует QR-код, сгенерированный профилем врачей, из своего приложения, которое отправляет authStatus на событие сокета что позволит серверу перенаправить на маршрут записи пациента.

Настройка сокета сервера выглядит следующим образом:

router.get('/patientinfoqrcode',redirectRoutes.redirectLoginDoctor,function(req,res){
    let usernameQR = req.query.usernameQR
    let message='';
    io.on("connection",function(socket){
        console.log("The user has been connected")

        io.on("disconnect",function(){
            console.log("The user has been disconnected")
        })

        socket.on("Auth",function(data){
            if(data.authStatus=='authorized'){
                res.redirect(`/dashboard?usernamePatient=${usernameQR}`)
            }
        });

    })

    res.render('doctor/patientinfoqrcode',{usernameQR})
});

Настройка приложения nativescript приведена ниже:

const socketio = SocketIO.connect('https://secret-falls-76814.herokuapp.com/patientinfoqrcode'
    , options);

export function scanQR(args) {
    barcodescanner.scan({
    formats: "QR_CODE",   // Pass in of you want to restrict scanning to certain type
    message: "Use the volume buttons for extra light", // Android only, default is 'Place a barcode inside the viewfinder rectangle to scan it.'
    showFlipCameraButton: true,   // default false
    preferFrontCamera: false,     // default false
    showTorchButton: true,        // default false
    beepOnScan: true,             // Play or Suppress beep on scan (default true)
    torchOn: false,               // launch with the flashlight on (default false)
    closeCallback: function () { console.log("Scanner closed"); }, // invoked when the scanner was closed (success or abort)
    resultDisplayDuration: 500,   // Android only, default 1500 (ms), set to 0 to disable echoing the scanned text
    orientation: "landscape",     // Android only, optionally lock the orientation to either "portrait" or "landscape"
    openSettingsIfPermissionWasPreviouslyDenied: true // On iOS you can send the user to the settings app if access was previously denied
  }).then(
      function(result) {
        console.log("Scan format: " + result.format);
        console.log("Scan text:   " + result.text);
        const button = args.object;
        button.text = result.text;
            socketio.emit('Auth',{
                authStatus:'authorized'
            });

      },
      function(error) {
        console.log("No scan: " + error);
      }
  );
}

И он не работает так, как должен. Я думаю, что единственная проблема заключается в том, что socket.io, слушающий событие, находится внутри маршрута / PatientInfoQrcode, и этот маршрут выполняет все функции внутри него в момент загрузки. Тогда даже если что-то случится в теле router.get (), ничего не произойдет, потому что он уже обработал документ. На сервере весь проект загружен на героку

...