node.js - 为什么 socket 发射工作但 io.in 发射不工作?
问题描述
我正在开发一个聊天应用程序。客户端将消息发送chatId
到服务器,服务器加入房间并将当前消息发送回客户端。当用户发送一条新消息时,它应该被保存并发送到组。除了向组发送消息外,一切都按预期工作。如果我评论io.in emit
和取消评论socket.emit
然后,如预期的那样,连接的套接字会收到消息。为什么组不发出工作?套接字可以在多个组中吗?
socket.on('joinChat', async (chatId) => {
try {
const chat = await Chat.findById(chatId).populate({
path: 'messages',
populate: {path: 'author'}
}).limit(50);
if (chat) {
socket.join(chat._id);
socket.emit('allMessages', chat.messages);
};
} catch(err) {
console.log(err);
};
});
socket.on('submitNewMessage', async (data) => {
try {
let message = await Message.create({
content: data.content,
author: socket.user._id
});
if (message) {
let chat = await Chat.findById(data.chatId);
chat.messages.push(message._id);
await chat.save();
console.log('sending message to chat channel', chat._id);
io.in(chat._id).emit('newMessage', message);
// socket.emit('newMessage', message)
};
} catch(err) {};
});
反应客户端
export default function ChatPage(props) {
const {socket} = useSelector((state) => state.socket);
const [messages, setMessages] = useState([]);
const [message, setMessage] = useState('');
const [chatId, setChatId] = useState(null);
const [userId, setUserId] = useState(null);
const classes = useStyles();
function handleSubmit(event) {
event.preventDefault();
if (socket && chatId) {
socket.emit('submitNewMessage', ({content: message, chatId: chatId}));
setMessage('');
};
};
useEffect(async () => {
let res = await api.getChatId({friendId: props.match.params.userId});
if (res.status === 200 && res.data.chatId) {
setChatId(res.data.chatId);
setUserId(res.data.userId);
};
},[]);
useEffect(() => {
if (chatId && socket) {
socket.emit('joinChat', chatId);
socket.on('allMessages', (allMessages) => {
setMessages([...allMessages]);
});
socket.on('newMessage', (newMessage) => {
console.log('received message!');
setMessages((prev) => [...prev, newMessage])
});
};
}, [chatId, socket]);
return (
...
)
解决方案
推荐阅读
- java - 删除并重新创建文件/目录
- python - 使用 flask_dance 进行 OAuth2 的 SSLError
- regex - 需要正则表达式来匹配 Oracle 12cR1 源代码中的确切表名
- android - 在 Genymotion 地图服务中搜索城市目前无法正常工作
- bash - 使用 curl 作为元数据发送 XML 文件
- api - 使用 ocotokit 的 github API:无法为个人存储库创建/更新文件(无组织)
- symfony - 单击symfony中的按钮后如何更改布尔值
- database - 当所有值匹配时隐藏 MS Access 中的字段/列
- java - OSX:trustAnchors 参数必须为非空
- xpath - 如何从此动态 xpath 中创建通用 xpath?