Как слушать события в режиме реального времени с Socket.io - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь прослушивать в режиме реального времени события socket.io, у меня есть серверная часть в Node, которая ее излучает, и служба внешнего интерфейса, слушающая ее, но она отображается только в представлении после перезагрузки страницы.

Мое приложение отправит много событий за секунды (каждое событие - это запрос Post), после того как я отправлю запрос на публикацию, мой back-end console.log будет мгновенным (что я и хочу), но, как я уже сказалмой интерфейс не.

Узел:

const event = req.body;

app.post('/webhook', (req, res) => {
  io.sockets.on('connection', function (socket) {
    socket.emit('event', require('util').inspect(event));
  });

  res.json({
    status: 'ok'
  });
});

Сервис:

observable:Observable<string>;
  socket;

  constructor() {
    this.socket = io("http://localhost:8080");
  }

  getData(event: String) : Subject<any> {
    let subj = new Subject;
    this.socket.on(event, data => subj.next(data)); 

    return subj;
  }

Компонент:

constructor(private _eventsService : EventsService) {
    this._eventsService.getData('event').subscribe(data => {
      console.log(data); // Only logs after reload
    });
  }

В основном яя хочу продолжать слушать события во Front-end, и когда я отправляю запрос Post в / webhook, отправляет это событие, и мои обновления обновляются (или журналы и т. д.).

1 Ответ

0 голосов
/ 03 апреля 2019

Я думаю, что событие определено в неправильной области видимости и io.sockets.on («подключение» не должно вызываться каждый раз, когда появляется сообщение.

Если вы пытаетесь транслировать все подключенные клиенты каждый разэто пост, тогда я бы избавился от io.sockets.on ('connection' и просто использовал:

const inspect = require('util').inspect;
app.post('/webhook', (req, res) => {
  io.emit('event', inspect(req.body));

  res.json({
    status: 'ok'
  });
});

Если вы хотите только отправить сообщение и событие обратно клиенту, который его опубликовал, тогдавам нужно будет включить socket.id в полезную нагрузку и использовать его для отправки сообщения обратно клиенту. Предполагая, что req.body является объектом, что-то вроде:

const inspect = require('util').inspect;
app.post('/webhook', (req, res) => {
  if (req.body.socketId){
    io.to(req.body.socketId).emit('event', inspect(req.body));
  }
  res.json({
    status: 'ok'
  });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...