Отправить конкретное сообщение для конкретного socket.id width socket.io - PullRequest
0 голосов
/ 07 января 2019

У меня проблема с поиском правильного ответа на мою проблему. Я хочу, чтобы у меня были личные сообщения для каждого пользователя, такого как Telegram. Или, как уведомления в StackOverflow, событие сокета отправляется только определенному пользователю.

io.on('connection', function (socket) {
  // this will be only sent to a user that just connected
  socket.emit('news', { hello: 'world' });
});

Но как отправить конкретное сообщение с пользовательским идентификатором?

Вот мой socket.js

const socketio = require('socket.io')
const { redis, saveUser } = require('./redis')

module.exports.listen = function(app){
io = socketio.listen(app)

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

  socket.on('join', (payload) => {
    redis.get(payload.email (err, socket_id) => {
      socket.broadcast.to(socket_id).emit('join', `Hello ${payload.whoChat.name} Chat you`)
      })
    })      
  })

return io
}

но это ничего не отправляет моему пользователю, если при использовании комнат оно будет отправлено непосредственно в комнаты, и когда я ищу документы, io.to() и io.broadcast.to() можно использовать с комнатами сокетов.

поэтому я решил взять это просто, но неправильно здесь, мой server.js справа.

io.on('connection', function (socket) {
  socket.on('join', payload => {
   socket.emit('join', payload)
})

и на стороне клиента

socket.on('join', (payload) => { 
    // Compare data from socket with local data if match then push the message 
    // to users who recieve
    if ( payload.userId === localData.userId ) {
        this.message.push(payload.message)
    }
})

но на самом деле я посылаю это всем пользователям ... как это сделать правильно и правильно? а как сохранить пользователей socket.id? так как socket.id генерируются случайным образом, как вы сохраните его для будущего запроса, когда пользователь отключится?

1 Ответ

0 голосов
/ 07 января 2019

Вам необходимо сохранить карту для _socket_id / user_id_

Сервер

const sessionsMap = {};

io.on('connection', (socket) => {
  socket.emit('askForUserId');

  socket.on('userIdReceived', (userId) => {
    sessionsMap[userId] = socket.id;
  });

  socket.on('send', (message) => {
    const receiverId = sessionsMap[message.receiverId];
    const messageData = message.data;
    socket.broadcast.to(receiverId).emit('my message', messageData);
  });
});

Клиент

const userId = 'FOO';

io.on('askForUserId', () => {
  io.emit(userId);
});

io.on('send', (message) => {
  console.log('You received a message');
  console.log(message.data);
});

Примечание

Обязательно ознакомьтесь с таблицей Socket.IO , которая охватывает множество команд и вариантов использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...