Angular 5 socket.io не получает обновления в другом компоненте - PullRequest
0 голосов
/ 16 мая 2018

Контекст : у меня есть угловое приложение с бэкэндом в nodejs.У меня есть канал, который будет обновляться при получении сообщения с сервера.Когда новые данные вставляются, сервер уведомляется, но мой другой компонент ничего не получает.Я реализовал сокет в сервисе, который вводится в оба компонента.

Мой сервер построен следующим образом:

const port = 3000;
const server = require('http').Server(app);
const io = require('socket.io')(server);

io.on('connection', (socket) => {
console.log('New Connection..')
socket.on('action', (data) => {

switch(data) {
  case 'new_odds':
  socket.emit('refresh_odds', 'UPDATE FEED! (FROM SERVER)')
  break;
  case 'new_results':
  break; 
}
});
});
//listen on port omitted

Мой сервис в угловом формате:

const SERVER_URL = 'http://localhost:3000';

@Injectable()
export class SocketService {

constructor() {

}


private socket;

public initSocket(): void {
    this.socket = socketIo(SERVER_URL);
}

public disconnectSocket(): void {
  this.socket.disconnect();
}

public send(action: Action): void {
    this.socket.emit('action', action);
}

public onOddsMessage(): Observable<string> {
    return new Observable<string>(observer => {
        this.socket.on('refresh_odds', (data:string) => {
          observer.next(data)
        });
    });
}

public onEvent(event: Event): Observable<any> {
    return new Observable<Event>(observer => {
        this.socket.on(event, () => observer.next());
    });
}
}

Мой компонент канала использует сервис сокетов для прослушивания сообщений:

constructor(private _socket : SocketService) {
}

ngOnInit() {

this.initIoConnection();
}

private initIoConnection(): void {
  this._socket.initSocket();


this.ioConnection = this._socket.onOddsMessage()
  .subscribe((data: string) => {
    console.log('Recieved data from oddsMessage')
    //this.loadBetFeed();
  });
}

В другом компоненте, также использующем сервис, который я пытаюсь передать в сокет на сервере.Он получает сообщение на сервере и отправляет новое сообщение, но мой компонент канала НЕ принимает это

testSocket() {
  //NOTIFY SERVER THAT IT SHOULD TELL CLIENTS TO REFRESH
  console.log('Test Socket Clicked')
  this._socket.initSocket();
  this._socket.send(Action.ODDS);
}

Я не понимаю, что я делаю неправильно - я использую общую службу,Даже если компоненты используют разные сокетные соединения, это не должно иметь значения, так как они слушают одинаковые сигналы?Я тестировал в 2 вкладках браузера, а также в режиме инкогнито.Любая помощь приветствуется!

1 Ответ

0 голосов
/ 17 мая 2018

Проблема заключалась в том, что я отправлял сокет вместо сервера , что означает, что только текущее соединение могло видеть его.

Новый сервер:

 io.on('connect', (socket) => {
console.log('Connected client on port %s.', port);
socket.on('action', (data) => {
    io.emit('refresh_odds', 'UPDATE FEED! (FROM SERVER)') <-- changed socket to io
});
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...