当只运行一个实例时,底部的代码运行良好,如果我使用更传统的
io.sockets.to(clientId).emit('Message', Object);
这也适用于socket.io/redis/cluster场景。在这种情况下,我需要客户机的响应,但是,我发现,假设集群中有两个实例,我有50%的机会将消息实际到达特定的socketid。同样,当将此限制为一个运行实例时,我没有看到这个问题,因此它似乎与redis/cluster方面有关。弄不清我在这里缺少什么。
var io = require('socket.io')(server);
io.set('transports', ['websocket']);
const redisAdapter = require('socket.io-redis');
io.adapter(redisAdapter({ host: SERVER, port: PORT }));
var data = upload.single('data');
app.post('/getData', data, function(req, res) {
var clientId = req.body.targetId
io.in(clientId).clients((err, clients) => {
if (err) {
res.sendStatus(500)
console.log(err)
return
}
if (!clients) return
var object = {
token: req.body.dataToken,
patid: req.body.patId
}
var client = clients[0]
console.log(client) //client will console log just fine here as the socketid
io.sockets.connected[client].emit('FOO', object, response=> {
res.send(JSON.stringify({"data": response}))
})
})
})
编辑:
在对对象进行了一些深入研究之后,会发现io.sockets.connected是特定于该实例的,这与我看到的一致。我想我的问题是,有没有办法使用socket.io-redis发出回调?