I’m trying to make a list of connected users using key and value pairs. The key will be the connected user, when I received a message I want to emit this to the receiver and sender (to and from) Now I’m stuck on the part where I want to add the new connected user. How do I add the user to the user to the array?
Second issue is the foreach is not a function
let connectedUsers: { [key: string]: Socket } io.on('connection', (socket: Socket) => { socket.on('USER_CONNECTED', (profile: Profile) => { connectedUsers !== undefined && Object.keys(connectedUsers).includes(profile.userId) && Object.assign(connectedUsers, { [profile.userId]: socket }) console.log(connectedUsers) }) socket.on('MESSAGE_SENT', (message: ChatMessage) => { connectedUsers.forEach(cli => { if (cli.key = message.to || cli.key = message.from) { cli.emit('MESSAGE_RECIEVED', message) } }); })
Advertisement
Answer
connectedUsers
is not an array but an object, so you can’t use forEach
to iterate it.
The good news is that you don’t need it!
When connectedUsers
is populated you can refactor on message function like
socket.on('MESSAGE_SENT', (message: ChatMessage) => { connectedUsers[message.to].emit('MESSAGE_RECIEVED', message); connectedUsers[message.from].emit('MESSAGE_RECIEVED', message); })
To add a user to the object connectedUsers
simply
socket.on('USER_CONNECTED', (profile: Profile) => { connectedUsers = Object.assign(connectedUsers, { [profile.userId]: socket }) console.log(connectedUsers) })