Когда работает только один экземпляр, код внизу работает нормально, и если я использую более традиционный
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}))
})
})
})
Edit:
После небольшого копания в объекте может показаться, что io.sockets.connected специфичен для экземпляра, что соответствует тому, что я видел. Я предполагаю, что мой вопрос, то есть, есть ли способ с обратным вызовом с помощью socket.io-redis?