首页 > 解决方案 > 如何使用 Socket.io 实时监听事件

问题描述

我试图实时监听socket.io事件,我在Node中有一个后端,发出它,前端服务正在监听它,但它只在我重新加载页面后显示在视图中。

我的应用程序将在几秒钟内发送很多事件(每个事件都是一个 Post 请求),在我发送一个 post 请求后,我的后端 console.log 是即时的(这是我想要的),但正如我所说,我的前面-end 不是。

节点:

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 请求时,将发出该事件,并且我的视图更新(或日志等)。

标签: javascriptnode.jsangularsocket.iorxjs

解决方案


我认为事件定义在错误的范围内,每次有帖子时都不应该调用 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'
  });
});

推荐阅读