如何使用Socket.io实时监听事件

时间:2019-04-02 23:20:58

标签: javascript node.js angular socket.io rxjs

我试图实时侦听socket.io事件,我在Node中有一个后端,发出它,并有一个前端Service在监听它,但是它仅在我重新加载页面后才显示在视图中。

我的应用程序将在几秒钟内发送很多事件(每个事件都是一个Post请求),在我发送一个Post请求之后,我的后端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
    });
  }

基本上,我想继续监听前端中的事件,当我向/ webhook发送Post请求时,将发出该事件,并更新视图(或日志等)。

1 个答案:

答案 0 :(得分:0)

我认为事件在错误的范围内定义,并且io.sockets.on('connection'不应在每次发布时都被调用。

如果您每次尝试将所有已连接的客户端发布为广播时, 那么我会摆脱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'
  });
});