Как получить данные от клиента, используя события socket.io внутри экспресс-контроллера? - PullRequest
0 голосов
/ 28 сентября 2018

Я использую Express Framework с TypeScript:

Я хочу получить местоположение клиента при входе в систему с помощью Socket IO, поэтому на стороне клиента я произвел событие emit на странице входа в систему.На стороне сервера я попытался интегрировать событие сокета в контроллер входа в систему, который помещается до того, как ответ будет отправлен обратно клиенту, но событие с сервера запускается сразу после того, как я уже вошел в систему и нажал на кнопку «Выйти».кнопка, которая приводит меня к странице входа снова (это тот момент, когда я получаю сообщение о местоположении на стороне сервера из console.log (data)).

Вот как файл контроллера аутентификации (auth.controller.ts)) выглядит следующим образом:

 import { io } from '../server/https';
 ....
 ..

 public authenticate(req: Request, res: Response) {
   if(req.body.email && req.body.password) {
     ....
     ..

     io.on('connection', (socket: SocketIO.Socket) => {
       console.log('New Socket Connected!');
       socket.on('client-location', (data) => {
         console.log(data);
       });
       socket.on('disconnect', (reason) => {
         console.log(reason);
       });
     });
     res.status(200).json({
       resType: 'success',
       token: 'Bearer ' + token,
       userId: user.id,
       message: 'Authenticated.',
       loginNumber: result.session.length
     });

   };
    ....
    ..

}

Импорт {io} в auth.controller.ts - это экспортированная константа io из файла https.ts.Ниже приведен файл https.ts:

 import socketIO from 'socket.io';
 import HTTPS from 'https';

 import app from '../app/index';
 ....
 ..

 const options = {
     cert: fs.readFileSync(path.resolve('../../../certificates/ca.crt')),
     key: fs.readFileSync(path.resolve('../../../certificates/ca.key'))
 }

 export const server = HTTPS.createServer(options, app)
 .listen(process.env.HTTP_SERVER_PORT, () => {
     console.log(`Platform Server is running from 
  ${process.env.HTTP_SERVER_HOST}, port: ${process.env.HTTP_SERVER_PORT}`);
 });

 export const io = socketIO.listen(server);

Что-то не синхронизировано, и я не получаю его.

На стороне клиента написано в Angular 6 и компонент, откуда происходит событиеиспускается ниже:

import { Component, OnInit } from '@angular/core';
import { LoginService } from '../../services/login.service';
import { Router } from '@angular/router';
import * as io from 'socket.io-client';

import { env } from '../../../../../environments/environment';

@Component({
  selector: 'login-form',
  templateUrl: './login-form.component.html',
  styleUrls: ['./login-form.component.css']
})

export class LoginFormComponent implements OnInit {

  public positionOptions = {
      enableHighAccuracy: true,
      maximumAge: 0
  };
  public LoginFormModel: any = {};
  private URL = `${env.WS_SERVER_URL}:${env.HTTP_SERVER_PORT}`;
  private socket;

  constructor(private loginController: LoginService,
   private router: Router) { 
    this.socket = io(this.URL);
  }

  ngOnInit() {}

  public emitLocation() {
      navigator.geolocation.getCurrentPosition(position => {
        const { latitude: lat, longitude: lng } = position.coords;
        console.log({ lat, lng });
        this.socket.emit('client-location', { lat, lng });
      },
      err => {
        console.log(err);
      }, this.positionOptions);
  }

  loginEvent() {
      this.loginController.login(this.LoginFormModel.email.value, 
      this.LoginFormModel.password.value)
      .subscribe(
         result => {
           this.loginController.createSession('token', result.token);
           this.emitLocation();
           this.router.navigate(['user/profile']);
         },
         err => {
         console.log(err);
         });
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...