首页 > 解决方案 > 来自端点的 Socket.io 和 Express 回调

问题描述

这是我的场景。我有一个简单的 express/socket.io 应用程序和一些 python 客户端(使用 python-socketio),每当用户访问我唯一的端点时都需要更新它们。

在套接字连接之后,我将其保存socket.id在一个数组中,以便从我的发布路由发送到一个特定的客户端。

let sockets = []

app.post('/confirm/', (req, res) => {

  // Get destination socket
  socket_id = sockets[0] // testing purpose

  io.to(socket_id).emit('confirm', {
    'order_id': 'a8hds87',
  })
})

io.on('connection', (socket) => {
  console.log('user connected');
  sockets.push(socket.id)
});

现在这工作正常,但现在我一直试图在我的发射上定义一个回调。如果我尝试添加如下回调,Node 会不断告诉我Callbacks are not supported when broadcasting。但是,由于我针对的是出现to(socket_id)此错误的特定客户端,因此对于像我这样的新手来说似乎很奇怪。我哪里错了?

io.to(socket_id).emit('confirm', {
  'order_id': 'a8hds87',
}, (callback) => {
  // my callback
})

标签: expresssocket.io

解决方案


您可以将实际的套接字对象本身推送到数组中,而不是推送 ID。然后你可以使用socket.emit()which 将支持回调。

问题io.to().emit()在于它返回一个BroadcastOperator只知道如何进入.emit()房间的对象(asocket.id也是一个仅包含一个套接字的房间名称)。

而且,我假设您知道当套接字断开连接时,您需要将其从阵列中删除。


我刚刚在 socket.io 的最新版本中发现了一种新方法.allSockets()。所以,使用它你也可以这样做:

const socket = Array.from(io.to(socket_id).allSockets())[0];
socket.emit(msg, data, callback);

看起来像是一种 hack,但它会将 asocket_id转换为socket对象。


推荐阅读