express - 来自端点的 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
})
解决方案
您可以将实际的套接字对象本身推送到数组中,而不是推送 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
对象。
推荐阅读
- python - 如何删除 TensorFlow 自定义操作实例?
- postgresql - Postgres 内存不足
- javascript - Javascript && 和 || 运算符和内联三元函数产生 INSANE 结果
- r - 如何从两个向量中选择增加的值 - '编织两个向量'
- java - 如何在 java8 中使用 compareTo 对 LinkedLists 进行排序
- java - Hive selectExpression : ( 表达式 | tableAllColumns );])
- amazon-web-services - Alexa 技能控制台返回 null
- ios - UIApplication.shared 可用性的编译时测试?
- eclipse - Bean 属性“empname”不可读或具有无效的 getter 方法:getter 的返回类型是否与 setter 的参数类型匹配?
- bots - 尝试使用 Telegram Bot 删除“left_chat_member”消息