javascript - Socket 为每个连接到的房间客户端发出多个事件
问题描述
我的 react-native 组件正在接收它连接到的每个先前房间的套接字事件。
我有一个简单的组件,当它安装时它会尝试加入一个套接字房间,而当其他人加入房间时它会尝试获取最新的房间数据。
当我第一次加载大厅时,我可以很好地加入房间,服务器会发出一个事件说“updateRoom”,每个连接的客户端都会收到该事件并调用更新方法。
如果我返回一个屏幕,然后返回大厅加入一个新房间,我会收到 2 个新成员已加入的事件。1 似乎用于旧房间,1 用于新房间。如果我一遍又一遍地重复这个步骤,我每次离开并开始一个新房间时都会收到额外的事件。
我的组件看起来像这样:
class LobbyScreen extends Component {
componentDidMount() {
const {
route: {
params: {
roomId
}
},
socket,
user
} = this.props
socket.on('updateRoom', () => {
getRoom({ roomId })
})
socket.emit('joinRoom', {
roomId,
userId: user._id
})
}
render() {
return (
<View style={styles.container}>
...
</View>
)
}
}
我有一个简单的套接字服务器来处理连接以及接收和发出加入房间的事件:
io.on("connection", socket => {
socket.on("joinRoom", ({ roomId, userId }) => {
socket.join(roomId, () => {
io.to(roomId).emit("updateRoom", { userId }) // tells everyone in the room that user with userId joined
})
})
})
解决方案
问题在于你的服务器代码没有反应!如果用户应该一次只出现在一个房间中,您应该将代码更改为:
socket.on("joinRoom", ({ roomId, userId }) => {
socket.leave(PREVIOUS_ROOM); // leave previous room before joining a new one
socket.join(roomId, () => {
io.to(roomId).emit("updateRoom", { userId })
})
推荐阅读
- node.js - MongoNetworkError:第一次连接时无法连接到服务器 [mongodb:27017]
- python - 二次公式:python 将浮点数视为字符串
- azure - 我无法从数据块中的 spark 数据帧创建加载数据到 Azure Synapse (DWH)
- android - /mobile/mobile 应用代码/app/build/generated/not_namespaced_r_class_sources/debug/processDebugResources/r/android/arch/lifecycle/livedata/core 的索引
- python - 使用烧瓶部署时,我必须在哪里复制文件 style.css?
- javascript - event.value 和 event.target.value 的区别
- jquery - 材料设计需要获得现有芯片的价值
- c++ - 多个`cin`没有给出正确答案
- python - 我不断收到“只有大小为 1 的数组可以转换为 Python 标量”,但我不知道为什么
- node.js - 如何使用 ExcelJS 在 NodeJS 中附加现有的 Excel 文件