Por lo tanto, estoy tratando de hacer un sistema de notificación, pero me encuentro con un problema.
Envié una invitación a un usuario para unirse al club.
socket.on("notify", async (message) => { // invite the user John Doe io.to('socket.id of John Doe').emit('notificaton', msg); });Pero, ¿cómo obtengo el socket.id de John Doe para enviarle la notificación de invitación?
John Doe recibe el mensaje después de actualizar la página, que recibe la notificación de la base de datos. Pero no quiero que John Doe se actualice cada vez que revise su notificación. Quiero que sea en tiempo real. Pero para enviarle la notificación en tiempo real, solo puedo pensar en una cosa y es almacenar el socket.id de John Doe en la base de datos y actualizarlo cada vez que John Doe inicie sesión en la aplicación, lo que podría causar un problema si John Doe ha iniciado sesión en varios dispositivos con la misma cuenta porque el socket.id puede ser diferente en otros dispositivos. Y solo uno de sus dispositivos recibe la notificación. * No sé si socket.id es diferente para cada dispositivo cuando se inicia sesión con varios dispositivos *
¿Pueden ayudarme a encontrar una mejor solución?
Por lo general, uno mantiene el socket en alguna estructura de datos en memoria (como un objeto Map) donde un ID de usuario es la clave y el socket actual para ese usuario son los datos. Luego, puede buscar el socket de cualquier usuario con su ID de usuario e interno a su aplicación, usa su ID de usuario (algo persistente que no está vinculado a socket.io) para identificar al usuario. Luego, puede buscar el socket de cualquier usuario en cualquier momento (si están conectados actualmente).
Cuando un usuario se conecta, agrega su socket al objeto Map y cuando se desconecta, lo elimina. También puede asegurarse de que tanto el cliente como el servidor de la conexión socket.io sepan qué ID de usuario representan.
Tenga en cuenta que no puede almacenar un objeto de socket en su base de datos, ya que es un objeto vivo que incluye un estado de código nativo que no se puede almacenar directamente en una base de datos. Almacenaría un socket.id que es solo una cadena en una base de datos, pero generalmente solo mantendría una estructura de datos en memoria para los usuarios actualmente conectados.