MERN 스택 및 socket.io를 사용한 비공개 채팅에 대한 도움이 필요합니다.
특정 사용자에게 개인 메시지를 성공적으로 보낼 수 있지만 두 사용자에게 모두 표시할 메시지 발신자를 포함할 수 없습니다.
두 사용자 모두에게 표시할 메시지와 함께 보낸 사람을 포함하는 데 도움이 필요합니다. 그리고 위의 코드가 이전 메시지보다 우선하므로 메시지를 제대로 추가하고 싶습니다.
고객
export default function Chat({ users }) {
const [activeUser, setActiveUser] = useState('');
const [currentUser, setCurrentUser] = useState(null);
const [filteredList, setFilteredList] = useState([]);
const [message, setMessage] = useState('');
const [chats, setChats] = useState([]);
useEffect(() => {
const jwt = isAuthenticated().user;
setCurrentUser(jwt);
config.socket;
config.socket.on('isOnline', (data) => {
console.log(data);
});
}, []);
useEffect(() => {
const list = users.filter(user => currentUser ? user._id !== currentUser._id : user._id);
setFilteredList(list);
}, [currentUser]);
useEffect(() => {
config.socket.on('chat', (data) => {
setChats([...chats, data]);
});
}, []);
const changeActiveUser = (e, user) => {
e.preventDefault();
console.log(`changeActiveUser ${JSON.stringify(user)}`);
setActiveUser(user);
};
const handleClick = e => {
e.preventDefault();
const msg = {
socketId: activeUser.socketId,
to: activeUser._id,
toUser: activeUser.username,
message: message,
from: currentUser._id
}
// config.socket.emit('join', {id: activeUser.socketId, username: activeUser.username})
console.log(`Private MSG ${JSON.stringify(msg)}`);
config.socket.emit('private', msg);
setMessage('');
}
return (
<>
<div className='container'>
<div className='row'>
<div className='col-3 leftSide'>
{filteredList.map((user) => (
<li key={user._id} className={`list ${user._id === activeUser._id ? 'active' : ''}`} onClick={e => changeActiveUser(e, user)}>
<img className='userImg' src={user.gender === 'Female' ? '/female.jpg' : '/male.jpg'} /> {user.name} <small> ({user.username}) <span>{user.online ? 'online' : 'offline'}</span></small>
</li>
))}
</div>
<div className='col-9 rightSide'>
<div className='row'>
<div className='col rightTop'>
<h1>{activeUser.username ? `${activeUser.username} (${activeUser._id})` : 'Start a chat!'}</h1>
<ul>
{chats && chats.map((chat, i) => (
<li key={i}>
<span>{activeUser._id === chat.from ? <span style={{ float: 'left' }}>{`${activeUser.username}: ${chat.message}`}</span> : <span style={{ float: 'right' }}>{`Me: ${chat.message}`}</span>}</span>
{/* <div>{activeUser._id === chat.to ? <div style={{ float: 'right' }}>{`Me: ${chat.message}`}</div> : ''}</div> */}
</li>
))}
</ul>
</div>
</div>
<hr />
{activeUser && (
<div className='row rightBottomContainer'>
<div className='rightBottomInput'>
<input value={message} type='text' onChange={(e) => setMessage(e.target.value)} placeholder=' Enter your chat...' />
</div>
<div className='rightBottomButton'>
<button onClick={(e) => handleClick(e)} type='submit'>Send</button>
</div>
</div>
)}
</div>
</div>
</div>
</>
);
}
섬기는 사람
const users = {};
io.on('connection', (socket) => {
console.log(`${socket.id} connected`);
socket.on('signin', (data) => {
users[data.username] = data.socketId;
socket.emit('isOnline', { userId: data.userId, online: true });
});
console.log(`USERS: ${JSON.stringify(users)}`);
// socket.on('join', (data) => {
// console.log(`JOIN: ${JSON.stringify(data)}`);
// socket.join(data.id);
// });
socket.on('private', (msg) => {
console.log(`users[msg.toUser] ${users[msg.toUser]} === msg.socketId ${msg.socketId}`);
if (users[msg.toUser] === msg.socketId) {
console.log(msg);
io.to(msg.socketId).emit('chat', msg);
}
});
socket.on('disconnect', () => {
console.log(`${socket.id} disconnected`);
});
});
나는 또한 stackoverflow 에 문제를 게시했습니다.
도움을 주시면 감사하겠습니다.
미리 감사드립니다.
Reference
이 문제에 관하여(MERN 스택 및 socket.io를 사용한 비공개 채팅에 대한 도움이 필요합니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/rammurthykota/need-help-with-private-chat-using-mern-stack-and-socket-io-14l7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)