¿Cómo emito a todos los miembros de una sala desde una instancia de socket?
Sé que puedo hacer io.in('room').emit('event', data); si tengo acceso a la instancia de IO, pero en mi caso solo tengo acceso al socket del remitente, almaceno el socket del usuario en un objeto de usuario y lo paso alrededor de mi código para que pueda emitir desde cualquier lugar, pero como resultado no tengo acceso a la instancia de IO.
¿Cómo puedo emitir a todos los miembros de una sala, incluido el remitente, desde la instancia de socket del remitente?
Bueno, es mejor que te des acceso a la instancia de io de alguna manera para que puedas hacer io.in(room).emit(...) . Puede exportarlo desde donde lo creó y luego importarlo donde se encuentre o puede hacer que esté disponible de otra manera.
Aquí hay otras cuatro formas de hacerlo:
Adjunte la propiedad .io a cada socket
En el archivo, donde crea la instancia io , puede adjuntarla como una propiedad a cada socket.
// put io on each socket io.on('connection', socket => { socket.io = io; }); Luego, en cualquier socket, puede obtener io con socket.io .
Ponga la instancia io en su objeto de app
Si la app está disponible, algunas personas colocan la instancia de io en el objeto de la app con app.set("io", io); entonces el código en otro lugar puede obtenerlo con io.get("io"); .
Enviar a la habitación y a sí mismo
Como solución alternativa, también puede enviar a ambos:
socket.broadcast(room).emit(...); socket.emit(...); Usar socket.server no documentado
También hay una propiedad no documentada en el socket que le da acceso al objeto del servidor. Úselo bajo su propio riesgo:
socket.server.in("room").emit(...); que esencialmente te da la instancia io .