'Can't emit data to a room with socket.to(room).emit(/*....*/) but simple emit works
So can't get socket.to("room").emit() to work whereas simple emit works. I am making a simple chat app. I put a counter variable so I can know how many people are in the room. I just can't figure out how to make this work.
server.js (see the send message event)
const app=require('express')();
const server=require('http').createServer(app);
const io = require('socket.io')(server,{
cors: {
origin: "*",
}
});
var count=0;
io.on("connection", (socket) => {
console.log("Socket id-",socket.id);
console.log("socket is ready to be connected");
socket.on("join_room",(data)=>{
socket.join(data);
console.log(`User with ${socket.id} connected in room ${data}`);
console.log("no of ppl in room",count++);
});
socket.on("send_message",(curr_message)=>{
console.log(curr_message.room);
socket.to(curr_message.room).emit("recieve_message",curr_message);
});
socket.on("disconnect",()=>{
console.log("User disconnected...",socket.id);
});
});
server.listen(5000,()=>console.log("srever is listening at port 5000..."));
chat.js(see useEffect hook)
import React from 'react';
import {useState,useEffect} from 'react';
import Button from '@mui/material/Button';
import SendIcon from '@mui/icons-material/Send';
function Chat({username,room,socket}) {
const [message,setMessage]=useState('');
const [messageList,setMessageList]=useState([]);
const sendMessage=async ()=>{
if(message !== "")
{
const messageData={
author: username,
room: room,
message: message,
time:
new Date(Date.now()).getHours() +
":"+
new Date(Date.now()).getMinutes(),
};
console.log("sending message",messageData);
await socket.emit("send_message",messageData);
}
}
useEffect(()=>{
socket.on("recieve_message",(data)=>{
console.log("recieving message",data);
setMessageList((list)=>[...list,data]);
});
}, [socket]);
return (
<div className='chat-window'>
<div className='chat-header'>
<p> Live Chat</p>
</div>
<div className='chat-body'>
{
messageList.map((messageContent)=>{
return <h1>{messageContent.message}</h1>;
})
}
</div>
<div className='chat-footer'>
<input type="text" placeholder="chat here..." value={message} onChange={(e)=>setMessage(e.target.value)} />
<Button className="Button" variant="contained" endIcon={<SendIcon />} onClick={sendMessage} ></Button>
</div>
</div>
);
}
export default Chat;
app.js (I don't think problem is here)
import './App.css';
import {useState,useEffect} from 'react';
import io from 'socket.io-client';
import Chat from './Chat';
import Button from '@mui/material/Button';
// import {Container} from 'react-bootstrap';
function App() {
const socket = io.connect("http://localhost:5000");
const [userName,setUserName]=useState('');
const [roomCode,setRoomCode]=useState('');
const [showChat,setshowChat]=useState(false);
const joinRoom = ()=>{
if(userName!==''&&roomCode!==''){
socket.emit("join_room",roomCode);
setshowChat(true);
}
}
return (
<div className="App">
{!showChat ?
(<div className='joinChatContainer'>
<h3>Join Room</h3>
<input type="text" placeholder="Your Name" value={userName} onChange={(e)=>setUserName(e.target.value)}/>
<input type="text" placeholder="Room Code" value={roomCode} onChange={(e)=>setRoomCode(e.target.value)}/>
<button onClick={joinRoom}>Join Room</button>
</div>
) :
(<Chat username={userName} room={roomCode} socket={socket} />)
}
</div>
);
}
export default App;
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
